Pregunta

No, esta no es una pregunta sobre genéricos.

Tengo un patrón Factory con varias clases con constructores internos (no quiero que se creen instancias si no es a través de la fábrica).

Mi problema es que CreateInstance falla con el error "No hay ningún constructor sin parámetros definido para este objeto" a menos que pase "verdadero" en el parámetro no público.

Ejemplo

// Fails
Activator.CreateInstance(type);

// Works
Activator.CreateInstance(type, true);

Quería hacer la fábrica genérica para hacerlo un poco más simple, así:

public class GenericFactory<T> where T : MyAbstractType
{
    public static T GetInstance()
    {
        return Activator.CreateInstance<T>();
    }
}

Sin embargo, no pude encontrar cómo pasar ese parámetro "verdadero" para que acepte constructores no públicos (internos).

¿Me perdí algo o no es posible?

¿Fue útil?

Solución

Para solucionar esto, ¿no podría simplemente modificar su uso como tal?

public class GenericFactory<T> where T : MyAbstractType
{
    public static T GetInstance()
    {
        return Activator.CreateInstance(typeof(T), true);
    }
}

Su método de fábrica seguirá siendo genérico, pero la llamada al activador no utilizará la sobrecarga genérica.Pero aún así deberías lograr los mismos resultados.

Otros consejos

Si es absolutamente necesario que el constructor sea privado, puedes probar algo como esto:

public abstract class GenericFactory<T> where T : MyAbstractType
{
    public static T GetInstance()
    {
        return (T)Activator.CreateInstance(typeof(T), true);
    }
}

De lo contrario, es mejor agregar la nueva restricción y seguir esa ruta:

public abstract class GenericFactory<T> where T : MyAbstractType, new()
{
    public static T GetInstance()
    {
        return new T;
    }
}

Estás intentando utilizar GenericFactory como clase base para todas tus fábricas en lugar de escribir cada una desde cero, ¿verdad?

además de Activator.CreateInstance(typeof(T), true) para funcionar, T debería tener un constructor predeterminado

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top