首页 新闻 会员 周边 捐助

表达式树执行属性反射

0
悬赏园豆:10 [已解决问题] 解决于 2016-02-25 14:16
        private static Func<object, object> MakeGetFunc2(PropertyInfo propertyInfo)
        {
            var getter = typeof(PropertyInfo).GetMethod("GetValue", new Type[] { typeof(object) });
            var propertyInst = Expression.Constant(propertyInfo);
            var paramInst = Expression.Parameter(typeof(object));
            var bodyExp = Expression.Call(propertyInst, getter, paramInst);
            var blockExp = Expression.Block(typeof(object), new ParameterExpression[] { paramInst }, bodyExp);
            var result = Expression.Lambda<Func<object, object>>(blockExp, paramInst).Compile();
            return result;
        }

上面方法的目的是:

 

基于propertyInfo,调用GetValue方法。但执行时报告未传递参数。

 

        public class T
        {
            public int Age { get; set; }
        }

        static void Main(string[] args)
        {
            var property = typeof(T).GetProperty("Age");
            var getter = MakeGetFunc2(property);
            getter(new T());
        }
519740105的主页 519740105 | 大侠五级 | 园豆:5810
提问于:2016-02-24 16:57
< >
分享
最佳答案
0

//var blockExp = Expression.Block(typeof(object), new ParameterExpression[] { paramInst }, bodyExp); var result = Expression.Lambda<Func<object, object>>(bodyExp, paramInst).Compile();

收获园豆:10
Daniel Cai | 专家六级 |园豆:10424 | 2016-02-25 09:46
其他回答(1)
0

本质上是var blockExp = Expression.Block(typeof(object), new ParameterExpression[] { paramInst }, bodyExp);这里的错误,paramInst一共作为了两次形参在外层的LambdaExpression和里层的BlockExpression中,由于作用域的原因,new T()对象只传到了外层,这里可以去掉Expression.Block中new ParameterExpression[] { paramInst },让内层可捕获到传入的这个对象

jello chen | 园豆:7336 (大侠五级) | 2016-02-25 15:08

好的,我试下。

另外一个问题,也拜托下:http://q.cnblogs.com/q/79990/

支持(0) 反对(0) 519740105 | 园豆:5810 (大侠五级) | 2016-02-25 15:11
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册