Non si può fare costruttori generica, ma è possibile utilizzare un metodo statico generico invece:
public static Constructor CreateInstance<T>(int blah, IGenericType<T> instance)
e poi fare quello che bisogno di dopo il costruttore, se necessario. Un'altra alternativa in alcuni casi potrebbe essere quella di introdurre un'interfaccia non generica che si estende all'interfaccia generica.
EDIT: Come per i commenti ...
Se si desidera salvare l'argomento in oggetto appena creato, e si vuole farlo in un modo fortemente tipizzato, quindi il tipo deve essere generico come pure .
A quel punto il problema costruttore va via, ma si potrebbe voler mantenere un metodo generico statica in ogni caso in un tipo non generico: in modo da poter usufruire di inferenza di tipo:
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);
fonte
2009-03-31 13:35:47
lo farei piace salvare IGenericType come membro var, per farlo suppongo che avrei dovuto rendere l'intera classe generica non solo il metodo ...? – CSharpAtl
Sì, se è necessario che sia fortemente digitato come variabile membro, è necessario rendere generico l'intero tipo e quindi il problema del costruttore scompare. –
vorrebbe eseguire la mia idea di progettazione da parte tua per vedere se c'è qualcosa di fondamentalmente migliore da fare. Non penso di poter digitare tutto in questo commento. Posso postare sul tuo blog o email? – CSharpAtl