2009-07-02 73 views
0

假設我有兩個包含靜態變量XmlTag的類。第二類繼承自第一類。我有一個模板方法,需要根據它使用的類型來獲取XmlTag。什麼是最好的方式來實現這一點,而不必創建一個類型的實例?這裏有一個例子(不會編譯),應該有希望說明我在說什麼。訪問靜態變量的模板方法問題

class A{ 
public static readonly string XmlTag = "AClass"; 
} 

class B : A { 
public static readonly string XmlTag = "BClass"; 
} 

此方法當前無效..靜態變量顯然無法從Type參數中訪問。

string GetName<T>(T AClass) where T : A 
{ 
    return T.XmlTag; 
} 

回答

5

首先,停止將泛型方法視爲模板。他們不是模板。它們與模板有着非常不同的行爲;你期望他們像模板一樣行事,這可能是你在這種情況下導致你誤入歧途的原因。

這是我寫的關於您的場景以及爲什麼它是非法的一系列文章。

http://blogs.msdn.com/ericlippert/archive/2007/06/14/calling-static-methods-on-type-variables-is-illegal-part-one.aspx

http://blogs.msdn.com/ericlippert/archive/2007/06/18/calling-static-methods-on-type-variables-is-illegal-part-two.aspx

http://blogs.msdn.com/ericlippert/archive/2007/06/21/calling-static-methods-on-type-variables-is-illegal-part-three.aspx

注意,當然是 「動態」 的功能,我在第三部分暗示,其實是航運與C#4.0。

要解決您的實際問題:「這是做什麼的最好方法?」據推測,你有一些問題,你相信這樣的機制會解決。這個機制在C#中並不存在。 我們不可能推斷出實際上你試圖解決什麼問題,因爲你希望這個機制存在。而不是問「如何讓這個不可能的事情在C#中工作?」而不是描述了你有真正的問題,我們可以嘗試提出一個現有的C#機制,更好地解決您的真正問題。

+0

謝謝你的回覆。你的文章是一個有趣的閱讀。我的問題很簡單,但我很難想出一個好的解決方案:我有幾個子類,每個子類都有自己獨特的XML標籤常量。我有一個泛型方法Load(),它接受任何這些子類,並從XmlNode中加載該類的實例。 Load()需要根據正在使用的類型獲取xml標籤,以便知道要查找哪些xml標籤。 – Mav3rick 2009-07-02 20:25:36

+0

只有在找到xml標籤後纔會實例化子類。 – Mav3rick 2009-07-02 20:33:03

1

有沒有直接的方法可以做到這一點,而不訴諸反思。

如果你真的想這樣做(我建議你首先要考慮改變你的高層設計):

爲了得到一個字段值:

var returnValue = typeof(T).GetField("FieldName").GetValue(null); 

要獲得一個屬性:

var returnValue = typeof(T).GetProperty("PropertyName").GetValue(null, null); 

要調用的方法:

typeof(T).InvokeMember("MethodName", BindingFlags.Static | BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.NonPublic, null, null, null); 
0

爲什麼不給bas類創建一個虛擬的GetTagName類,並讓繼承類覆蓋那個?

class A{ 
public virtual string GetXmlTagName() 
    { 
    return "AClass"; 
    } 
} 

它會解決您的即時症狀,但林不知道解決您的問題。它有一個絕對的代碼氣味,但不知道更多我可能是錯誤的,當我聲明XML的概念應該存在於不同的類中,並且在A和B中具有該概念違反單一責任原則。基本上我會從信息中知道我只是怕它