C# 反射动态给属性赋值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 反射动态给属性赋值相关的知识,希望对你有一定的参考价值。

我一个实体 有get和set方法
我现在写一个方法,比如
public ListsInfo tranXML(string xmlData)
System.Xml.XmlDocument xmldoc = new System.Xml.XmlDocument();
xmldoc.LoadXml(xmlData);//加载xml
XmlNodeList list = xmldoc.SelectSingleNode("/rss").ChildNodes;
Record record = null;
ListInfo lists = new ListInfo();
List<Object> recordList = new List<Object>();
foreach (XmlNode xn in list)

//读取cmd节点
if (xn.Name.Equals("cmd"))

lists.Cmd = xn.InnerText;



我想把 if (xn.Name.Equals("cmd"))

lists.Cmd = xn.InnerText;
这个判断改成动态的 lists.Cmd 是ListInfo类中的一个属性
我想通过xn.Name.Equals("变量")动态给ListInfo属性赋值
再java里面我做过 是可以实现的 但是C# 不太了解
有谁对这个比较了解的 请告诉下 谢谢了

public static T PopulateEntityFromCollection<T>(T entity, IDataReader collection) where T : new()

//初始化 如果为null
if (entity == null)

entity = new T();

//得到类型
Type type = typeof(T);
//取得属性集合
PropertyInfo[] pi = type.GetProperties();
foreach (PropertyInfo item in pi)

//给属性赋值
if (collection[item.Name] != null)

item.SetValue(entity, Convert.ChangeType(collection[item.Name], item.PropertyType), null);


return entity;

你可以仿造我以前这个方法写追问

能不能通过字符串 比如 我方法传递一个字符串
然后通过传递进去的字符串 判断对象中是否存在该属性 如果存在就赋值

追答

属性名字在这里 collection[item.Name]
所以如果要从给定的字符串里判断首先要看字符串的格式 然后截取出属性名字后比较就可以了

参考技术A 1.我觉得你需要是一个“反序列化”,.NET已经很好的提供了,可以自己百度一下
2.如果一定要用反射,那么可以这样

var props=typeof(ListInfo).GetProperties();
ListInfo lists = new ListInfo();
List<Object> recordList = new List<Object>();
foreach (XmlNode xn in list)

var prop= props.First(c=>c.Name==xn.Name);//获取同名属性
if(prop!=null)//如果属性存在
prop.SetValue(lists ,xn.InnerText);//赋值****在这里需要考虑类型问题


追问

SetValue好像有三个参数吧
看来C#高深莫测啊 以前学到的都是皮毛而已

c#利用反射给字段属性赋值

先定义一个类:

 public class User
    {
        public User()
        {
            Console.WriteLine($"{this.GetType().Name}被构造");
        }
        public int Id { get; set; }
        public string Name { get; set; }

        public string ClassID;
    }

 

反射:

//常规写法赋值
{
                User user = new User();
                user.Id = 123;
                user.Name = "张三";
                user.ClassID = "1";
                Console.WriteLine($"User.Name={user.Name}");
                Console.WriteLine($"User.ClassID={user.ClassID}");
                Console.WriteLine($"User.Id={user.Id}");
            }
//利用反射动态赋值
 {
                Type type = typeof(User);  //获取类型
                object a = Activator.CreateInstance(type);   //创建对象
                foreach (var Prop in type.GetProperties())//GetProperties获取属性
                {
                    Console.WriteLine($"{type.Name}.{Prop.Name}={Prop.GetValue(a)}");
                    if (Prop.Name.Equals("Id"))
                    {
                        Prop.SetValue(a, 213);//设置值
                    }
                    else if (Prop.Name.Equals("Name"))
                    {
                        Prop.SetValue(a,"张三");
                    }
                    Console.WriteLine($"{type.Name}.{Prop.Name}={Prop.GetValue(a)}");//获取值
                }
                foreach (var Field in type.GetFields())//GetFields获取字段
                {
                    Console.WriteLine($"{type.Name}.{Field.Name}={Field.GetValue(a)}");
                    if (Field.Name.Equals("ClassID"))
                    {
                        Field.SetValue(a, "213");
                    }          
                    Console.WriteLine($"{type.Name}.{Field.Name}={Field.GetValue(a)}");
                }
            }

 

以上是关于C# 反射动态给属性赋值的主要内容,如果未能解决你的问题,请参考以下文章

C# 利用反射给不同类型对象同名属性赋值

C# 实体/集合差异比较,比较两个实体或集合值是否一样,将实体2的值动态赋值给实体1(名称一样的属性进行赋值)

反射学习2-通过反射机制动态获取属性的值模拟Struts的自动赋值

C#控件给实体类赋值

反射给对象赋值——类型转换

c# 如何通过反射 获取属性值