[深入学习C#]利用反射给对象赋值

转载自诗人江湖老,原文地址
 C#中利用反射能够获取对象的属性信息,也可以利用反射给对象赋值。
我们如果想利用凡是给一个对象属性赋值可以通过PropertyInfo.SetValue()方式进行赋值,但要注意值的类型要与属性保持一致。

  假设我们有如下一个结构:

struct Person
{
        public string code{get; set;}
        public string name{get; set;}
}

  下面一段代码,展示了如何利用反射来给对象赋值:
  

Person p =new Person(){code="123456", name="Jay"};
Person item=new Person();
PropertyInfo[] props=p.GetType().GetProperties();
props.ToList().ForEach(
    pi=>
    {
          if (!pi.PropertyType.IsGenericType)
                    {
                        if (pi.GetValue(p) != null)
                        {
                            pi.SetValue(item, Convert.ChangeType(pi.GetValue(p), pi.PropertyType));
                        }
                    }
                    else
                    {
                        Type genericTypeDefinition = pi.PropertyType.GetGenericTypeDefinition();
                        if (genericTypeDefinition == typeof(Nullable<>))
                        {
                            if (pi.GetValue(p) != null)
                            {
                                pi.SetValue(item, Convert.ChangeType(pi.GetValue(p), Nullable.GetUnderlyingType(pi.PropertyType)));
                            }
                        }
                    });

   pi.SetValue(item, Convert.ChangeType(pi.GetValue(p), pi.PropertyType))
   pi.SetValue(item, Convert.ChangeType(pi.GetValue(p), Nullable.GetUnderlyingType(pi.PropertyType)))
   这两行代码,分别是给非泛型属性赋值和给泛型属性赋值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值