2009-03-31 23 views
31

Tengo una interfaz de tipo genérico y quiero un constructor de un objeto para tomar en la interfaz genérica. Al igual que
:Tipo genérico en el constructor

public Constructor(int blah, IGenericType<T> instance) 
{} 

Quiero el código que crea este objeto para especificar la IGenericType (uso Inversión de Control). No he visto una manera de que esto suceda. Alguna sugerencia para lograr esto?

Quiero a alguien para crear el objeto como:

Constructor varname = new Constructor(1, new GenericType<int>()); 

Respuesta

40

No se puede hacer constructores genérica, pero se puede utilizar un método estático genérico en lugar:

public static Constructor CreateInstance<T>(int blah, IGenericType<T> instance) 

y luego hacer lo que necesita hacerlo después del constructor, si es necesario. Otra alternativa en algunos casos podría ser introducir una interfaz no genérica que amplíe la interfaz genérica.

EDIT: De acuerdo con los comentarios ...

Si desea guardar el argumento en el objeto recién creado, y desea hacerlo de una manera inflexible, entonces el tipo debe ser genérica, así .

En ese momento el problema constructor se va, pero puede desee mantener un método genérico estática de todos modos en un tipo no genérico: para que pueda tomar ventaja de la inferencia de tipos:

public static class Foo 
{ 
    public static Foo<T> CreateInstance<T>(IGenericType<T> instance) 
    { 
     return new Foo<T>(instance); 
    } 
} 

public class Foo<T> 
{ 
    public Foo(IGenericType<T> instance) 
    { 
     // Whatever 
    } 
} 

... 

IGenericType<string> x = new GenericType<string>(); 
Foo<string> noInference = new Foo<string>(x); 
Foo<string> withInference = Foo.CreateInstance(x); 
+0

lo haría me gusta guardar el IGenericType como miembro var, para hacer eso supongo que tendré que hacer toda la clase genérica no solo el método ...? – CSharpAtl

+0

Sí, si necesita que esté fuertemente tipado como una variable miembro, entonces debe hacer que todo el tipo sea genérico y luego el problema del constructor desaparecerá. –

+0

me gustaría ejecutar mi idea de diseño para ver si hay algo fundamentalmente mejor que hacer. No creo que pueda escribirlo todo en este comentario. ¿Puedo publicar en tu blog o enviarte un correo electrónico? – CSharpAtl

Cuestiones relacionadas