C#特性与反射:从XML文件创建对象

本文探讨了如何利用C#的反射特性,从XML文件中读取数据并创建对象实例,对对象的部分属性进行初始化。内容涵盖XML文件格式及反射在对象实例化中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用C#反射,从XML文件生成对象实例,以对其部分属性赋值。


1. XML文件的格式:

<Root>
	<Test>
		<ID>1001</ID>
		<Title>Engineer</Title>
		<Salary>10000</Salary>
	</Test>
</Root>



2. 对象类定义:


    [AttributeUsage(AttributeTargets.Property)]
    public class MyTestAttribute : Attribute
    {
    }
    
    public class Test
    {
        public Test(){}

        private string id;
        private string name;
        private string title;
        private int salary;

        public string ID
        {
            get { return id; }
            set { id = value; }
        }
        public string Title
        {
            get { return title; }
            set { title = value; }
        }
        public int Salary
        {
            get { return salary; }
            set { salary = value; }
        }

        [MyTest]
        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        public override string ToString()
        {
            return string.Format("ID:{0}\nName:{3}\nTitle:{1}\nSalary:{2}\n", id, title, salary, string.IsNullOrEmpty(name) ? "***" : name);
        }
    }

3. 使用默认构造函数创建对象实例示例方法:


static void Main(string[] args)
        {
            CreateObj<Test>("test.xml");
            Console.ReadLine();
        }

        static void CreateObj<T>(string pathname) where T : class
        {
            Type t = typeof(T);
            XDocument doc = XDocument.Load(pathname);
            Assembly asm = Assembly.GetExecutingAssembly();
            foreach (var node in doc.Element("Root").Elements(t.Name))
            {
                object test = asm.CreateInstance(t.FullName);
                foreach (var p in t.GetProperties())
                {
                    bool mytest = false;
                    foreach (var attr in p.CustomAttributes)
                    {
                        if (attr.AttributeType == typeof(MyTestAttribute))
                        {
                            mytest = true;
                            break;
                        }
                    }
                    if (mytest) continue;
                    object obj = null;
                    switch (p.PropertyType.Name)
                    {
                        case "String":
                            obj = node.Element(p.Name).Value;
                            break;
                        case "Int32":
                            obj = int.Parse(node.Element(p.Name).Value);
                            break;
                        default: break;
                    }
                    p.SetValue(test, obj);
                }
                Console.WriteLine(test.ToString());
            }
        }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值