2010-02-24 102 views
0

我有一個包含一些業務對象的通用業務對象的集合類:如何在C#中使用泛型類型參數作爲常規類型?

public abstract class BusinessObjectCollection<T> : ICollection<T> 
    where T : BusinessObject 

我想寫一個返回類型T和一個返回類型的新實例化對象的方法在我的收藏類中的方法T.

在C++中,這將是您只需聲明typedef value_type T;並使用BusinessObjectCollection :: value_type的地方,但我無法在C#中找到等效項。

有什麼建議嗎?

編輯:一位接近平行,我想的類型定義是方法:

Type GetGenericParameter() { 
    return typeof(T); 
} 

回答

10

嘗試是這樣的:

public abstract class BusinessObjectCollection<T> : ICollection<T> 
    where T : BusinessObject, new() 
{ 
    // Here is a method that returns an instance 
    // of type "T" 
    public T GetT() 
    { 
     // And as long as you have the "new()" constraint above 
     // the compiler will allow you to create instances of 
     // "T" like this 
     return new T(); 
    } 
} 

在C#中,你可以使用類型參數(即T ),就像你在代碼中的任何其他類型一樣 - 沒有什麼額外的你需要做的。

爲了能夠創建T(不使用反射)的實例,您必須使用new()約束類型參數,這將保證任何類型參數包含無參數構造函數。

+0

其實這也使用反射。 C#發出對Activator.CreateInstance的調用。 – Josh 2010-02-24 22:54:47

+0

*編譯器*發出對「Activator.CreateInstance」的調用是非常正確的。我只是簡單地說,OP不必直接使用反射API,並不是說反射在封面下不被使用。 – 2010-02-25 00:34:47