2008-09-11 20 views
11

No, esta no es una pregunta acerca de los genéricos.Activator.CreateInstance (cadena) y Activator.CreateInstance <T>() diferencia

Tengo un patrón de fábrica con varias clases con constructores internos (no quiero que se creen instancias si no son de fábrica).

Mi problema es que CreateInstance falla con un error "No se definió ningún constructor sin parámetros 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 que sea un poco más simple, como esto:

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

Sin embargo, he podido encontrar la forma de pasar que la "verdadera" parámetro para aceptar constructores no públicos (internos).

¿Echo de menos algo o no es posible?

+2

Por qué no definir un constructor sin parámetros con la variable booleana privada se define como true? – Vivek

Respuesta

20

Para evitar esto, couldnt que acaba de 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 todavía será genérica, pero la llamada al activador no va a utilizar la sobrecarga genérica. Pero aún debes lograr los mismos resultados.

+0

Una buena solución, pero me gustaría saber si es posible también – juan

+0

Si la sobrecarga no existe, tendría que decir que no. – Kilhoffer

3

Si es absolutamente requiere que el constructor sea privada puede intentar 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 el mejor de la adición de la nueva restricción y yendo por ese camino:

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

Usted Estamos tratando de utilizar GenericFactory como una clase base para todas sus fábricas en lugar de escribir cada una desde cero ¿no?

+0

La primera opción es la misma que la de Kilhoffer La segunda no funcionará, agregando nueva() a la que requiere que el tipo tenga un parámetro público, que es exactamente lo que no quiero – juan

+0

Sí, su publicación apareció mientras escribía el mío. – rpetrich

0

además Activator.CreateInstance (typeof (T), true) para trabajar, T debe tener constructor por defecto

Cuestiones relacionadas