繁体   English   中英

C#-接受任何类型参数的方法(重用现有方法)

[英]C# - method that accepts any type of parameter (reusing an existing method)

我有一个方法serializetoxml ,它接受obj1类型的对象作为其参数:

class Program
{
    static void Main(string[] args)
    {
        obj1 myobj = new obj1();
        serializetoxml(myobj);    
    }
}

public class obj1
{
    public string a { get; set; }
    public int b { get; set; }
    public bool c { get; set; }
}

public static void serializetoxml(obj1 myobj)
{
    XmlSerializer myserializer = new XmlSerializer(typeof(obj1));
    TextWriter mywriter = new StreamWriter("C:\\my.xml");
    myserializer.Serialize(mywriter, myobj);
    mywriter.Close();
}

现在我有一个要传递的类obj2作为其参数

public class obj2
{
    public int a { get; set; }
    public bool b { get; set; }
    public List<string> c { get; set; }
}

如何重用serializetoxml方法以能够接受另一种类型的参数,以便不再编写相同的方法并将typeof更改为obj2

obj2 myobj = new obj2();
serializetoxml(myobj);

添加类型参数:

public static void serializetoxml<T>(T myobj)
{
    XmlSerializer myserializer = new XmlSerializer(typeof(T));
    TextWriter mywriter = new StreamWriter("C:\\my.xml");
    myserializer.Serialize(mywriter, myobj);
    mywriter.Close();
}

然后,您可以像这样使用它:

serializetoxml<obj2>(myobj);

要么

serializetoxml<obj1>(myobj);

借助类型参数推断的魔力,您可以完全省略类型参数(但是,如果您希望将其保留在那里,就可以了):

serializetoxml(myobj);

尝试以下

public static void serializetoxml(object myobj) {
    XmlSerializer myserializer = new XmlSerializer(myobj.GetType());
    TextWriter mywriter = new StreamWriter("C:\\my.xml");
    myserializer.Serialize(mywriter, myobj);
    mywriter.Close();
}

将方法移至静态类,并使其成为扩展方法 ,如下所示:

internal static class Extensions {
    public static void SerializeToXml<T>(this T myobj)
        {
            XmlSerializer myserializer = new XmlSerializer(typeof(T));
            TextWriter mywriter = new StreamWriter("C:\\my.xml");
            myserializer.Serialize(mywriter, myobj);
            mywriter.Close();
        }
}

现在,您可以像使用实例方法一样使用它。 您需要将Extensions类放入相同的名称空间,或为其添加using指令。

两种选择:

  • 泛型: Serialize<T>(T obj)typeof(T)
  • 对象: Serialize(object obj)obj.GetType()

根据痛苦的经验,我实际上更喜欢第二种序列化方法,但是两者都是有效的。

public static void serializetoxml(object myobj)
{
    XmlSerializer myserializer = new XmlSerializer(obj1.GetType());
    TextWriter mywriter = new StreamWriter("C:\\my.xml");
    myserializer.Serialize(mywriter, myobj);
    mywriter.Close();
}

真的没问题 只需使您的序列化方法对通用类型起作用即可。 请参见将泛型与XmlSerializer一起使用的堆栈溢出问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM