今天有个网友问如何历遍对象的所有公共属性,并且生成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. codevs 2803 爱丽丝·玛格特罗依德

    二次联通门 : codevs 2803 爱丽丝·玛格特罗依德 /* codevs 2803 爱丽丝·玛格特罗伊德 高精 + 找规律 显然, 能拆3就多拆3 不能拆就拆2 注意特判一下 */ #incl ...

  2. GitBook github

    创建一个新的仓库 创建一个新文件,名为SUMMARY.md 创建一本书首先进入gitbook的官网:https://www.gitbook.com/ 创建账户https://github.com/ 在 ...

  3. youtube 下载视频插件

    https://zh.savefrom.net/userjs-for-google-chrome.php

  4. Camtasia如何录制小文件视频

      Camtasia 录制设置   FrameRate设成4就行,音频格式:PCM, 8000Hz, 8 位, 单声道, 7KB/秒 ,这样更小.   文章来源:刘俊涛的博客 欢迎关注公众号.留言.评 ...

  5. 微信小程序for循环中传递动态参数

    for循环中的参数,没法传到对应的 js里,所以直接在 wxml页面上跳转 发送参数的 wxml页面 <view class="uploader" wx:for=" ...

  6. springMVC:为MultipartFilte配置了上传文件解析器,报错或不能使用

    一.问题描述为支持restful风格请求,并且应对可能上传文件的情况,需要在配置hiddenHttpMethodFilter过滤器之前配置MultipartFilter.目的是让MultipartFi ...

  7. 解决bootstrap-table表头filter-control select控件被遮挡显示不全的问题

    [本文出自天外归云的博客园] 在使用bootstrap-table的extension——filter-control时(对应表格的data-filter-control="true&quo ...

  8. 内存自动清理.sql

    --清除存储过程缓存 DBCC FREEPROCCACHE --注:方便记住关键字 FREEPROCCACHE可以拆解成 FREE(割舍,清除) PROC(存储过程关键字简写),CACHE(缓存) - ...

  9. oracle plsql 统计

    set serveroutput on DECLARE cursor cemp is select to_char(hiredate,'yyyy') from emp ; phiredate ); c ...

  10. react一些问题

    一.死循环 1.问题描述 function handleClick() { this.setState({count: ++this.state.count}); console.log(" ...