使用表达式树来获取/设置成员的值

         public   static   object  GetPropertyValue < T > ( this  T model,  string  name)
        {
            var type 
=  model.GetType();
            var property 
=  type.GetProperty(name);
            
if  (property  ==   null )
                
return   null ;
            
// 传参 类型为type
            var getParameter  =  Expression.Parameter( typeof (T),  " model " );
            
// 把参数T类型转为真实类型
            var convertParameter  =  Expression.Convert(getParameter, type);
            
// 获取属性
            var getProperty  =  Expression.Property(convertParameter, property);
            
// 转为object类型
            var convertProperty  =  Expression.Convert(getProperty,  typeof ( object ));
            
// 生成表达式
            var lambda  =  Expression.Lambda < Func < T,  object >> (convertProperty, getParameter).Compile();
            
return  lambda(model);
        }
        
public   static   void  SetPropertyValue < T, TResult > ( this  T model,  string  name, TResult value)
        {
            var type 
=  model.GetType();

            var p 
=  type.GetProperty(name);

            var paramObj 
=  Expression.Parameter(type,  " obj " );

            var paramVal 
=  Expression.Parameter( typeof (TResult),  " val " );

            var body 
=  Expression.Call(paramObj, p.GetSetMethod(), paramVal);

            var f 
=  Expression.Lambda < Action < T, TResult >> (body, paramObj, paramVal).Compile();

            f(model, value);

        }

 

转载于:https://www.cnblogs.com/mad/archive/2009/12/11/1622101.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值