2012-06-27 88 views
19

我有一個超類,我們可以調用class A和幾個子類,例如class a1 : Aclass a2 : A,...和a6 : A。在我的class B中,我有一組方法創建B中的List<A>並將其中的一個子類添加到List<A>中。C#創建對象obj = new T()?

我想縮短我目前的代碼。因此,而不是寫

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

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

... 

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

相反,我想寫類似這樣

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

東西這可能嗎?

是否也可以約束T必須是A或其子類之一?

+0

的可能重複[創建泛型類型的實例嗎?](http://stackoverflow.com/questions/731452/create-instance-通用類型) –

回答

32

李的回答是正確的。

的原因是爲了能夠調用new T()你需要一個new()約束添加到您的類型參數:

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

您還需要一個約束T : A這樣您就可以添加你的類型的對象TList<A>

注意:當您將new()與其他約束一起使用時,new()約束必須來末尾

相關

+0

謝謝。這意味着我可以將類「A」作爲類型約束。有沒有辦法讓我只能通過'A'的子類作爲約束? – sehlstrom

+0

@sehlstrom:不,但是如果你願意,你可以在運行時測試它,如果有人傳遞了一個'A'類型的對象,就會拋出一個異常。您可能還想考慮製作「A」摘要。 –

+0

Greate!所以如果'A'是抽象的,我不能通過它?或者我可以通過它,但我不可能創建一個實例? – sehlstrom

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

有關更多信息,請查看http:// msdn .microsoft.com/EN-US /庫/ twcad0zb。 – SirPentor

+0

謝謝,救了我一天! – idok