欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#中利用LINQ to XML与反射把任意类型的泛型集合转换成XML格式字符串的方法

程序员文章站 2022-07-02 22:04:14
在工作中,如果需要跟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>

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!