C# XmlWriter序列化类到xml文件时动态遍历所有属性

当使用XmlWriter序列化一个类到XML文件并且想要动态遍历所有属性时,可以使用反射(reflection)来获取类的所有公共属性并逐个写入。以下是一个示例,展示了如何使用反射和XmlWriter将一个类的实例序列化到XML文件中:

首先,定义一个类,例如Person

 

Csharp

深色版本

1public class Person
2{
3    public string Name { get; set; }
4    public int Age { get; set; }
5    public string Occupation { get; set; }
6}

接下来,编写一个方法来序列化这个类的实例到XML文件中,使用反射来动态地处理属性:

 

Csharp

深色版本

1using System;
2using System.IO;
3using System.Xml;
4using System.Reflection;
5
6public static void SerializeObjectToXml(object obj, string filePath)
7{
8    using (FileStream fs = new FileStream(filePath, FileMode.Create))
9    {
10        using (XmlWriter writer = XmlWriter.Create(fs, new XmlWriterSettings() { Indent = true }))
11        {
12            // 写入XML文档的开头
13            writer.WriteStartDocument();
14
15            // 获取对象的类型
16            Type type = obj.GetType();
17
18            // 写入根元素,使用类名作为元素名
19            writer.WriteStartElement(type.Name);
20
21            // 遍历所有公共实例属性
22            PropertyInfo[] properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance);
23            foreach (PropertyInfo property in properties)
24            {
25                // 跳过索引器属性
26                if (property.GetIndexParameters().Length > 0)
27                    continue;
28
29                // 写入属性名作为元素名
30                writer.WriteStartElement(property.Name);
31
32                // 写入属性值
33                object value = property.GetValue(obj);
34                if (value is string stringValue)
35                {
36                    writer.WriteString(stringValue);
37                }
38                else if (value is int intValue)
39                {
40                    writer.WriteValue(intValue);
41                }
42                // 添加其他类型的支持,如日期、布尔值等
43                else
44                {
45                    writer.WriteString(value?.ToString() ?? "null");
46                }
47
48                // 结束元素
49                writer.WriteEndElement();

                    //也可以这样用
                    //wr.WriteStartElement("property");
                    //wr.WriteAttributeString("name", name);
                    //wr.WriteAttributeString("value", svalue);
                    //wr.WriteEndElement();
50            }
51
52            // 结束根元素
53            writer.WriteEndElement();
54
55            // 写入XML文档的结尾
56            writer.WriteEndDocument();
57        }
58    }
59}

在这个方法中,我们使用Type.GetProperties方法获取obj对象的所有公共属性。然后,我们遍历这些属性,跳过任何索引器属性(即那些带有参数的属性),并将每个属性的名称写入作为一个XML元素的开始标签。之后,我们使用property.GetValue来获取属性的实际值,并将其写入XML文件中。最后,我们为每个属性写入一个结束标签。

要使用这个方法,你可以这样做:

 

Csharp

深色版本

1Person person = new Person { Name = "John Doe", Age = 30, Occupation = "Developer" };
2string filePath = @"C:\temp\person.xml";
3SerializeObjectToXml(person, filePath);

这将会把Person对象序列化到指定路径的XML文件中。请注意,这个方法假设所有的属性都是可序列化的,并且没有嵌套的对象或集合。如果你的类包含嵌套对象或集合,你可能需要递归地调用SerializeObjectToXml方法或使用其他适当的序列化逻辑。

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值