Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 能够定义静态扩展方法的替代方法_C#_Generics_Serialization_Extension Methods - Fatal编程技术网

C# 能够定义静态扩展方法的替代方法

C# 能够定义静态扩展方法的替代方法,c#,generics,serialization,extension-methods,C#,Generics,Serialization,Extension Methods,我知道我不能在C#中扩展静态类,我真的不明白为什么,但我知道这是不可能的 因此,考虑到这一点,以下是我想要实现的目标: public static class GenericXmlSerialisationExtender { public static void WriteToXML<T>(this T targetObject, string fileName) { XmlSerializer serializer = new XmlSeriali

我知道我不能在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);
        }
    }
}

封装它的“正确”方式是什么?我曾经和一位同事一起工作,他认为“代码重用”就是复制和粘贴,我不想把自己放在那个括号里

我不是真的推荐这个,而是作为一种选择:

这很可怕,但在某种程度上,这只是解决问题的一种方法

我怀疑我真的会接受它,然后做:

MyType typeInstance = GenericXmlSerialisationExtender.ReadFromXml<MyType>(...);
MyType typeInstance=GenericXmlSerialisationExtender.ReadFromXml(…);

如果您可以给
GenericXmlSerialisationExtender
一个snappier名称,那应该不会太痛苦。

我并不推荐这样做,但作为一个选项:

这很可怕,但在某种程度上,这只是解决问题的一种方法

我怀疑我真的会接受它,然后做:

MyType typeInstance = GenericXmlSerialisationExtender.ReadFromXml<MyType>(...);
MyType typeInstance=GenericXmlSerialisationExtender.ReadFromXml(…);

如果您可以给
GenericXmlSerialisationExtender
一个snappier名称,那应该不会太痛苦。

您可以用您已经使用过的方法定义它,但要调用它,您需要使用标准的静态方法调用:

MyClass deserializedObject = GenericXmlSerialisationExtender.ReadFromXML<MyClass>(@"c:\filename.xml");
.net 3.5使您能够做到这一点:

public static class StringExtensions
{
    public static String AddFullStop(this String data)
    {
        return data + ".";
    }
}

String input = "test";
String output = input.AddFullStop();

因此,当您想在方便的扩展方法的范围之外做一些事情时,您只需返回到较旧的静态帮助器方法模式。

您可以用您已经完成的方式来定义它,但要调用它,您需要使用标准的静态方法调用:

MyClass deserializedObject = GenericXmlSerialisationExtender.ReadFromXML<MyClass>(@"c:\filename.xml");
.net 3.5使您能够做到这一点:

public static class StringExtensions
{
    public static String AddFullStop(this String data)
    {
        return data + ".";
    }
}

String input = "test";
String output = input.AddFullStop();

因此,当您想在方便的扩展方法的范围之外做一些事情时,您只需返回到较旧的静态助手方法模式。

其中您说“没有可附加扩展方法的对象”-这是我不理解的一点。为什么将它扩展到您建议的代码会是一个巨大的飞跃?不是在争论,只是想了解实际原因…@Matt:因为您没有在扩展方法签名中指定要扩展的“类型”。扩展方法将出现在哪种类型上?(在您的例子中,您实际上只想扩展“Object”,这是非常好的,但情况并非总是如此,您如何告诉编译器您希望静态扩展方法出现在字符串上)。这将需要C#设计团队添加更多语法更改,以允许您指定要静态扩展的类型。我想C#团队可以实现这种新语法,但这是一种非常罕见的情况。添加了扩展方法以支持非常常见的“静态助手类”模式。他们通常不会仅仅为了支持像您建议的那样的异常边缘情况而进行语法更改。它实际上也不会给您带来任何可读性,编写String.HelperMethod()之间并没有太大区别;或StringHelper.Method()@Simon-当然,如果您想限制方法可用的类型,您可以使用标准,并且已经定义了where约束-因此,对于字符串,只需使用
where T:String
?@Matt:“where T:String”无效-“字符串不是有效的约束。用作约束的类型必须是接口、非密封类或类型参数“是通用的。它不必与您建议的语法一致。泛型有一些限制,比如不能调用约束接口中未定义的方法,这将导致许多其他问题。最后,这种形式的泛型约束只约束类型必须从字符串继承(如果允许的话),这在所有情况下都是不够的。为什么将它扩展到您建议的代码会是一个巨大的飞跃?不是在争论,只是想了解实际原因…@Matt:因为您没有在扩展方法签名中指定要扩展的“类型”。扩展方法将出现在哪种类型上?(在您的例子中,您实际上只想扩展“Object”,这是非常好的,但情况并非总是如此,您如何告诉编译器您希望静态扩展方法出现在字符串上)。这将需要C#设计团队添加更多语法更改,以允许您指定要静态扩展的类型。我想C#团队可以实现这种新语法,但这是一种非常罕见的情况。添加了扩展方法以支持非常常见的“静态助手类”模式。他们通常不会仅仅为了支持像您建议的那样的异常边缘情况而进行语法更改。它实际上也不会给您带来任何可读性,编写String.HelperMethod()之间并没有太大区别;或StringHelper.Method()@Simon-当然,如果您想限制方法可用的类型,您可以使用标准,并且已经定义了where约束-因此,对于字符串,只需使用
where T:String
?@Matt:“where T:String”无效-“字符串不是有效的约束。用作约束的类型必须是接口、非密封类或类型参数“是通用的。它不必与您建议的语法一致。泛型有一些限制,比如不能调用约束接口中未定义的方法,这将导致许多其他问题。最后,这种形式的泛型约束只约束类型必须从字符串继承(如果允许的话),这在所有情况下都是不够的。谢谢。。。你能解释一下为什么会这样吗
public static class StringHelper
{
    public static String AddFullStop(String data)
    {
        return data + ".";
    }
}

String input = "test";
String output = StringHelper.AddFullStop(input);
public static class StringExtensions
{
    public static String AddFullStop(this String data)
    {
        return data + ".";
    }
}

String input = "test";
String output = input.AddFullStop();