2011-03-01 72 views
0

我的基類使用對派生類的反射來爲它們提供一些功能。目前我這樣做:如何在沒有泛型的基類中獲得派生類的類型?

abstract class BaseClass<T> 
{ 
    string GetClassString() 
    { 
     // Iterate through derived class, and play with it's properties 
     // So I need to know the type of derived class (here T). 
     return result; 
    } 

    static bool TryParse(string classString, out T result) 
    { 
     // I should declare a variable as T and return it 
    } 
} 

我可以做到這一點沒有泛型?

+2

'T' *不是*派生類的類型 - 或者至少不必是。想象一下'class MyDerivedClass:BaseClass '。這裏派生類是'MyDerivedClass',但'T'是'string'。 – 2011-03-01 12:47:30

+0

@Jon:那麼如何聲明'TryParse(string classString,out T derivedType) '? 'C#'是否允許我動態地在方法簽名中定義'derivedType'並且不使用'T'? – Xaqron 2011-03-02 02:46:52

回答

4

編輯:

對不起,您要的類型參數(即typeof(T))。 在這種情況下,您仍然使用this.GetType(),但是您之後添加了.GetGenericArguments()[0]

嘗試解析: 你需要創建一個類型的新實例,你不知道

有兩種方式:一是 ,在不改變休息,與活化劑類和下面的代碼:

result = (T) Activator.CreateInstance(typeof(T)) 

MSDN)。

之後,您可以添加一個「新」的約束你的類型:

MyClass<T> where T : new() {...} 
result = new T(); 

兩個樣本需要參數少構造。如果你想傳遞參數,那麼你需要深入System.Reflection內部,獲取構造函數列表並調用你想要的。工廠模式也可以完成這項工作。

+0

以及'TryParse'方法(我在編輯中添加了它)? – Xaqron 2011-03-01 12:56:25

+0

我在另一個編輯中添加了一些提示。 – 2011-03-01 13:50:13