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);
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
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á. –
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