type new how from example c# generics design-patterns

c# - new - Activator.CreateInstance(cadena) y Activator.CreateInstance<T>() diferencia



new typeof (3)

Para evitar esto, ¿no podrías modificar tu 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 debes lograr los mismos resultados.

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

Tengo un patrón Factory 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 el error "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 que sea 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).

¿Perdí algo o no es posible?


Si absolutamente requiere que el constructor sea privado, 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 mejor que agregue la nueva restricción y siga esa ruta:

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

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


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