今天有个网友问如何历遍对象的所有公共属性,并且生成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 = });
master.Slaves.Add(new Slave { Name = "bbb", ID = });
master.Slaves.Add(new Slave { Name = "ccc", ID = }); StringBuilder sb = new StringBuilder("<Root>\r\n");
//生成XML
foreach (PropertyInfo pi in master.GetType().GetProperties())
{
if (pi.PropertyType.IsGenericType)
{
sb.AppendLine($"<{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("</{pi.Name}>");
}
else
{
sb.AppendLine($"<{pi.Name}>{pi.GetValue(master, null)}</{pi.Name}>");
}
}
sb.AppendLine("</Root>");
MessageBox.Show(sb.ToString());

生成的XML结构:

<Root>
<Description>ABCD</Description>
<Slaves>
<Slave>
<ID>1</ID>
<Name>aaa</Name>
</Slave>
<Slave>
<ID>2</ID>
<Name>bbb</Name>
</Slave>
<Slave>
<ID>3</ID>
<Name>ccc</Name>
</Slave>
</Slaves>
</Root>

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

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

    由于ES5的限制 Vue  && Angular 双向绑定检测不到对象属性的添加和删除  还有数组增加索引.这些改变不会触发change事件.Vue是因为实例化的时候已经把各个属性都s ...

  2. Reset 对象属性

    Input Reset 对象 在 HTML 表单中 标签每出现一次,一个 Reset 对象就会被创建. 当重置按钮被点击,包含它的表单中所有输入元素的值都重置为它们的默认值.默认值由 HTML val ...

  3. 探究@property申明对象属性时copy与strong的区别

    一.问题来源 一直没有搞清楚NSString.NSArray.NSDictionary--属性描述关键字copy和strong的区别,看别人的项目中属性定义有的用copy,有的用strong.自己在开 ...

  4. [源码]Literacy 快速反射读写对象属性,字段

    Literacy 说明 Literacy使用IL指令生成方法委托,性能方面,在调用次数达到一定量的时候比反射高很多 当然,用IL指令生成一个方法也是有时间消耗的,所以在只使用一次或少数几次的情况,不但 ...

  5. Python 历遍目录

    Automate the Boring Stuff 学习笔记 01 使用 os 模块的 walk() 函数可以实现历遍目录的操作,该函数接收一个绝对路径字符串作为必选参数,返回三个参数: 当前目录—— ...

  6. 了解JavaScript 对象属性的标签

    对象属性的标签 value(属性值), writable(属性可写), enumerable(属性可枚举), configurable(属性可配置), 这些属性标签使对象所持有的属性体现出不同的特性, ...

  7. 区分元素特性attribute和对象属性property

    × 目录 [1]定义 [2]共有 [3]例外[4]特殊[5]自定义[6]混淆[7]总结 前面的话 其实attribute和property两个单词,翻译出来都是属性,但是<javascript高 ...

  8. JavaScript对象属性(一)

    对象object  对象和数组很相似,数组是通过索引来访问和修改数据,对象是通过属性来访问和修改数据的. 这是一个示例对象: var cat = { "name": "W ...

  9. JS中isPrototypeOf 和hasOwnProperty 的区别 ------- js使用in和hasOwnProperty获取对象属性的区别

    JS中isPrototypeOf 和hasOwnProperty 的区别 1.isPrototypeOf isPrototypeOf是用来判断指定对象object1是否存在于另一个对象object2的 ...

随机推荐

  1. SQL基础-存储过程&触发器

    一.存储过程 1.存储过程简介 存储过程: 一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,然后通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它. 存储过程的创建: ...

  2. eclipse debug调试 class文件 Source not found.

      1.情景展示 明明有class文件,为什么提示没有? 2.原因分析 这是eclipse与myeclipse的不同之处,myeclipse会自动加载运行时所需的的class文件,而eclipse则需 ...

  3. PHP系列 | Thinkphp3.2 上传七牛 bad token 问题 [ layui.upload 图片/文件上传]

    前端代码 <div class="logo_out" id="upload-logo"></div> JS代码 /** * 上传图片 * ...

  4. win101903版本vmware 14虚拟机插usb设备卡死

    win101903版本vmware 14虚拟机插usb设备卡死 问题的环境: win10,1903版本: vmware 14 版本: 安装的是ubuntu1604虚拟机: 当插入usb摄像头,并连接到 ...

  5. github将本地仓库的代码上传到Github

    本篇主要参考博文:https://blog.csdn.net/IT_faquir/article/details/52516214 你要先完成上一篇的操作,即将代码上传到本地仓库中,才能上传到gith ...

  6. C# Area区域配置,修改默认路由

    1.右键项目新建文件夹 Areas 2.先把项目分类包好,建两个文件夹,放Controller和View,Model也可以放在这里 因为项目启动默认打开的是Home/Index ,我把它放在了Webs ...

  7. 面试突击(五)——Java常用集合

    为了勾起回忆,我画了一个常用集合类的结构关系图,话不多说,详见下图: 实际开发中ArrayList/HashMap/HashSet是三种最常用的集合工具类,通过其结构关系图也能清晰的了解他们的特性,所 ...

  8. Nodejs 包与 npm第三方模块安装和 package.json 以及 cnpm

    包与 NPM 1. 包 Nodejs 中除了它自己提供的核心模块外,可以自定义模块,也可以使用第三方的模块.Nodejs 中第三方模块由包组成,可以通过包来对一组具有相互依 赖关系的模块进行统一管理. ...

  9. C++ Set运用实例

    C++ Set运用实例 #include <iostream> #include <set> #include <algorithm> #include <i ...

  10. libmodbus学习笔记

    libmodbus功能: a fast and portable Modbus library 库下载地址https://libmodbus.org 使用指南1)包含头文件#include <m ...