我的理解是我不能在C#中擴展靜態類,我不是真的理解爲什麼,但是我明白那它不能做到。替代能夠定義靜態擴展方法
因此,考慮到這一點,這裏就是我想實現:
public static class GenericXmlSerialisationExtender
{
public static void WriteToXML<T>(this T targetObject, string fileName)
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
using (TextWriter writer = new StreamWriter(fileName, false, Encoding.UTF8))
{
serializer.Serialize(writer, targetObject);
}
}
public static T ReadFromXML<T>(string fileName)
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
using (TextReader reader = new StreamReader(fileName, Encoding.UTF8))
{
return (T)serializer.Deserialize(reader);
}
}
}
即我想爲實例定義.WriteToXML(有很多配置/靜態數據類,我只需要使用vanilla XML Serialization),然後是.ReadFromXML類型。
所以有效地我可以打電話是這樣的:
MyType typeInstance = MyType.ReadFromXML(path_to_data);
什麼是該封裝的「正確」的方式?我曾與一位相信'代碼重用'的同事一起復制粘貼&,我寧願不把自己置於該支架中!
你在哪裏說「是沒有對象將擴展方法附加到」 - 這是我*不瞭解的位。爲什麼將它擴展到你所建議的代碼是一個非常大的飛躍?不是議論性的,只是想實際理解*爲什麼* ... – 2010-02-24 09:38:12
@Matt:因爲您尚未指定要在擴展方法簽名中擴展的「類型」。擴展方法將出現在哪種類型? (在你的情況下,你實際上只想擴展「Object」,但事實並非總是如此,你如何告訴編譯器你希望你的靜態擴展方法出現在Strings上)。這將需要C#設計團隊添加更多語法更改,以允許您指定想要靜態擴展的類型。 – 2010-02-24 09:42:23
我想C#團隊可以實現這種新的語法,但這是一個很不尋常的例子。添加了擴展方法來支持非常常見的「靜態幫助類」模式。他們通常不會對語法進行修改,只是爲了支持像您所建議的那樣的不尋常邊緣案例。它實際上並沒有給你帶來任何可讀性,編寫String.HelperMethod()之間沒有太大的區別。或StringHelper.Method(); – 2010-02-24 09:45:41