![](/img/trans.png)
[英]Method that accepts any parameter, loop through it for search into DateTime variables, change them and return a new object in 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.