C# 历遍对象属性

今天有个网友问如何历遍对象的所有公共属性,并且生成XML。采用序列化方式的话比较简单,我写个手工解析的例子,这样能让初学者更加理解也比较灵活,记录一下吧或许会有人用到。

对象模型:

    public class Master
    {
        public string Description { get; set; }
        public List<Slave> Slaves { get; set; }
    }

    public class Slave
    {
        public int ID { get; set; }
        public string Name { get; set; }
    }

解析代码:

  //生成数据
  Master master = new Master();
  master.Description = "ABCD";
  master.Slaves = new List<Slave>();
  master.Slaves.Add(new Slave { Name = "aaa", ID = 1 });
  master.Slaves.Add(new Slave { Name = "bbb", ID = 2 });
  master.Slaves.Add(new Slave { Name = "cccc", ID = 3 });

  StringBuilder sb = new StringBuilder("<Root>\r\n");
  //获取对象所有公共属性
  foreach (PropertyInfo pi in master.GetType().GetProperties())
  {
      //判断属性是否为集合类型
      if (pi.PropertyType.IsGenericType)
      {
          sb.AppendLine($"<Items name=\"{pi.Name}\">");
          //获取集合对象
          foreach (object items in (pi.GetValue(master, null) as IEnumerable<object>))
          {
              sb.AppendLine($"<{items.GetType().Name}>");
              //获取集合对象成员
              foreach (PropertyInfo item in items.GetType().GetProperties())
              {
                  sb.AppendLine($"<{item.Name}>{item.GetValue(items, null)}</{item.Name}>");
              }
              sb.AppendLine($"</{items.GetType().Name}>");
          }
          sb.AppendLine("</Items>");
      }
      else
      {
          sb.AppendLine($"<{pi.Name}>{pi.GetValue(master, null)}</{pi.Name}>");
      }
  }
  sb.AppendLine("</Root>");
  MessageBox.Show(sb.ToString());

生成的XML结构:

<Root>
  <Description>ABCD</Description>
  <Items name="Slaves">
    <Slave>
      <ID>1</ID>
      <Name>aaa</Name>
    </Slave>
    <Slave>
      <ID>2</ID>
      <Name>bbb</Name>
    </Slave>
    <Slave>
      <ID>3</ID>
      <Name>cccc</Name>
    </Slave>
  </Items>
</Root>

原文地址:https://www.cnblogs.com/MuNet/p/11479895.html

时间: 2024-11-09 06:09:43

C# 历遍对象属性的相关文章

Vue &amp;&amp; Angular 双向绑定检测不到对象属性的添加和删除

由于ES5的限制 Vue  && Angular 双向绑定检测不到对象属性的添加和删除  还有数组增加索引.这些改变不会触发change事件.Vue是因为实例化的时候已经把各个属性都setter和getter进去了. 两个实现的机制不一样.故解决方案也不一样. 详情查看:https://cn.vuejs.org/v2/guide/list.html#对象更改检测注意事项 Angular解决方案: 可以手动调用$apply()方法,会再自动轮询一遍 Vue解决方案: 使用vm.$set(对象

python0.16------构造函数/析构函数/self详解/重写/访问限制/对象属性和类属性/@property/运算符重载

构造函数:__init__()引子:因为每个人一出生都是不一样的.因此,如果在Person类中直接给类元素赋值有问题,它会导致每个人的初始状态相同,这不符合大自然的逻辑.应该根据每个人的特点,给每个出生的人不一样的特性.可以通过构造函数实现这个想法.__init__()函数在使用类创建对象自动调用.注意:如果不显式写出构造函数,默认会添加一个空的构造函数. 使用构造函数:def __init__(self,name,age,height,weight):#一般定义属性在构造函数里面定义. sel

JavaScript原生对象属性和方法详解——Array对象 转载

length 设置或返回 数组中元素的数目. 注意:设置 length 属性可改变数组的大小.如果设置的值比其当前值小,数组将被截断,其尾部的元素将丢失.如果设置的值比它的当前值大,数组将增大,新的元素被添加到数组的尾部,它们的值为 undefined.所以length不一定代表数组的元素个数. var arr = new Array(3) arr[0] = "John" arr[1] = "Andy" arr[2] = "Wendy" cons

javascript 对象属性的添加,删除,json对象和字符串转换方法等

1:动态添加 对象属性 var obj = new Object(); console.log (obj.username); obj.username = "haha"; console.log (obj.username); //undefined //haha 用"[]"表示.写成 obj["username"] = "haha"; var obj = new Object(); console.log (obj.use

Node对象属性

1.Node对象属性一            * nodeName             * nodeType            * nodeValue * 使用dom解析html时候,需要html里面的标签,属性和文本都封装成对象 <body> <span id="spanid">哈哈呵呵</span> <script type="text/javascript"> //获取标签对象 var span1 = d

javascript中对象属性的介绍

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <script type="text/javascript"> // 对象的属性是什么类型的? string // 如果对象的属性不是字符

js 中对象--属性相关操作

查询属性: 可以用 对象.属性 来查询属性和属性方法               或者                    对象[“属性”]  来查询属性和属性方法 演示代码: 1 <script> 2 var obj ={ 3 username:"ziksang", 4 age:22, 5 addr:"北京", 6 say:function(){ 7 return "我的名字叫 "+this.username //解析this,此

JavaScript 中关于Date的内置对象属性和方法的总结

Date 属性: 1.constructor    所建立对象的函数参考 2.prototype      能够为对象加入的属性和方法 方法: 1.getDay()    返回一周中的第几天(0-6) 2.getYear()    返回年份.2000年以前为2位,2000(包含)以后为4位 3.getFullYear()     返回完整的4位年份数 4.getMonth()      返回月份数(0-11) 5.getDate()       返回日(1-31) 6.getHours()  

linq 对象属性排序

WSWSVoucher [] wswsv = new WSWSVoucher[4]; wswsv= wswsv.OrderBy(s => s.creditAmount).ToArray<WSWSVoucher>(); wswsv= wswsv.OrderByDescending(s => s.creditAmount).ToArray<WSWSVoucher>(); linq 对象属性排序,布布扣,bubuko.com