5

私は System.Linq.Expressions にかなり慣れていないので、このコードの何が問題なのかを理解しようとしています:

 var mc = new MyClass();

        ParameterExpression value = Expression.Parameter(typeof(object), "value");
        ParameterExpression xParam = Expression.Parameter(typeof(MyClass), "x");

        Expression<Func<MyClass, object>> e = x => x.Val;

        BlockExpression block = Expression.Block(new[] { xParam, value },
            Expression.Assign(e.Body, value));

        Expression.Lambda<Action<MyClass, object>>(block, xParam, value).Compile()(mc, 5); //I'm getting exception here when Compile()

...

class MyClass
    {
        public object Val
        {
            get;
            set;
        }
        public object OtherVal
        {
            get;
            set;
        }
    }

MyClass と object パラメーターがラムダのパラメーターであると仮定して、 mc.Val = 5 のようなものを構築したいだけです(クロージャーを使用したくない)

4

1 に答える 1

8

e.Bodyからパラメータを参照しますe。しかし、それは とは異なるパラメータですxParam。二人が同じ名前を持っているだけでは十分ではありません。それらは同じオブジェクトでなければなりません。

ラムダを生成するためのツールとしてラムダを使用して式を取得しようとすることを理解してください。このアプローチを機能させるには、 のすべてのパラメータを制御するパラメータに置き換える必要がありeます ( xParam)。一貫性を保つ必要があります。

于 2012-12-03T20:00:35.973 に答える