2009-03-31 20 views
31

Ho un'interfaccia di tipo generico e voglio un costruttore di un oggetto per l'interfaccia generica.
Come:Tipo generico nel costruttore

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

voglio il codice che crea l'oggetto per specificare l'IGenericType (uso Inversion of Control). Non ho visto un modo per questo per accadere. Qualche suggerimento per realizzare questo?

voglio qualcuno per creare l'oggetto come:

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

risposta

40

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); 
+0

lo farei piace salvare IGenericType come membro var, per farlo suppongo che avrei dovuto rendere l'intera classe generica non solo il metodo ...? – CSharpAtl

+0

Sì, se è necessario che sia fortemente digitato come variabile membro, è necessario rendere generico l'intero tipo e quindi il problema del costruttore scompare. –

+0

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

Problemi correlati