2012-06-27 12 views
19

Ho una superclasse che possiamo chiamare class A e poche sottoclassi, ad es. class a1 : A, class a2 : A, ... e a6 : A. Nel mio class B, ho una serie di metodi che crea e aggiunge una delle sottoclassi a List<A> in B.C# crea l'oggetto obj = new T()?

Voglio accorciare il mio codice che ho al momento. Così, invece di scrivere

Adda1() 
{ 
    aList.Add(new a1()); 
} 

Adda2() 
{ 
    aList.Add(new a2()); 
} 

... 

Adda6() 
{ 
    aList.Add(new a6()); 
} 

Invece voglio scrivere qualcosa di simile a questo

Add<T>() 
{ 
    aList.Add(new T()); // This gives an error saying there is no class T. 
} 

è possibile?

È anche possibile limitare che T deve essere di tipo A o una delle sue sottoclassi?

+0

possibile duplicato del [Crea istanza di tipo generico?] (Http://stackoverflow.com/questions/731452/create-instance- di tipo generico) –

risposta

32

La risposta di Lee è corretta.

La ragione è che, al fine di essere in grado di chiamare new T() è necessario aggiungere un vincolo new() al vostro tipo di parametro:

void Add<T>() where T : new() 
{ 
    ... new T() ... 
} 

È inoltre necessario un vincolo T : A in modo che è possibile aggiungere il vostro oggetto di tipo T a List<A>.

Nota: Quando si utilizza new() insieme ad altri vincoli, il vincolo new() deve venire scorso.

correlati

+0

Grazie. Ciò significa che posso passare la classe 'A' come un vincolo di tipo. C'è un modo per rendere possibile solo passare sottoclassi di 'A' come un vincolo? – sehlstrom

+0

@sehlstrom: No, ma puoi testarlo in runtime se desideri e lanciare un'eccezione se qualcuno passa un oggetto di tipo 'A'. Potresti anche prendere in considerazione la possibilità di fare astratti 'A'. –

+0

Greate! Quindi se 'A' è astratto, non posso passarlo? Oppure posso passarlo, ma non sarò possibile creare un'istanza? – sehlstrom

26
public void Add<T>() where T : A, new() 
{ 
    aList.Add(new T()); 
} 
+0

Per ulteriori informazioni, consultare http: // msdn .microsoft.com/en-us/library/twcad0zb. – SirPentor

+0

Grazie, salvato il giorno! – idok