我的理解是我不能在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