C#中利用LINQ to XML与反射把任意类型的泛型集合转换成XML格式字符串的方法
程序员文章站
2022-04-15 09:34:25
在工作中,如果需要跟xml打交道,难免会遇到需要把一个类型集合转换成xml格式的情况。之前的方法比较笨拙,需要给不同的类型,各自写一个转换的函数。但是后来接触反射后,就知道...
在工作中,如果需要跟xml打交道,难免会遇到需要把一个类型集合转换成xml格式的情况。之前的方法比较笨拙,需要给不同的类型,各自写一个转换的函数。但是后来接触反射后,就知道可以利用反射去读取一个类型的所有成员,也就意味着可以替不同的类型,创建更通用的方法。这个例子是这样做的:利用反射,读取一个类型的所有属性,然后再把属性转换成xml元素的属性或者子元素。下面注释比较完整,就话不多说了,有需要看代码吧!
using system; using system.collections.generic; using system.linq; using system.text; using system.xml.linq; using system.reflection; namespace genericcollectiontoxml { class program { static void main(string[] args) { var persons = new[]{ new person(){name="李元芳",age=23}, new person(){name="狄仁杰",age=32} }; console.writeline(collectiontoxml(persons)); } /// <summary> /// 集合转换成数据表 /// </summary> /// <typeparam name="t">泛型参数(集合成员的类型)</typeparam> /// <param name="tcollection">泛型集合</param> /// <returns>集合的xml格式字符串</returns> public static string collectiontoxml<t>(ienumerable<t> tcollection) { //定义元素数组 var elements = new list<xelement>(); //把集合中的元素添加到元素数组中 foreach (var item in tcollection) { //获取泛型的具体类型 type type = typeof(t); //定义属性数组,xobject是xattribute和xelement的基类 var attributes = new list<xobject>(); //获取类型的所有属性,并把属性和值添加到属性数组中 foreach (var property in type.getproperties()) //获取属性名称和属性值,添加到属性数组中(也可以作为子元素添加到属性数组中,只需把xattribute更改为xelement) attributes.add(new xattribute(property.name, property.getvalue(item, null))); //把属性数组添加到元素中 elements.add(new xelement(type.name, attributes)); } //初始化根元素,并把元素数组作为根元素的子元素,返回根元素的字符串格式(xml) return new xelement("root", elements).tostring(); } /// <summary> /// 人类(测试数据类) /// </summary> class person { /// <summary> /// 名称 /// </summary> public string name { get; set; } /// <summary> /// 年龄 /// </summary> public int age { get; set; } } } }
把属性作为属性输出:
<root> <person name="李元芳" age="23" /> <person name="狄仁杰" age="32" /> </root>
把属性作为子元素输出:
<root> <person> <name>李元芳</name> <age>23</age> </person> <person> <name>狄仁杰</name> <age>32</age> </person> </root>
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
上一篇: 浅谈C#中正则表达式的使用
下一篇: 怎么能在我的房间里养宠物