0

外部式ツリーで宣言した場合:

var creatorExpression = Expression.New(targetType);

そして、これを新しいインスタンスのプロパティに値を割り当てる 1 つまたはサブ式で使用したいと思います。

var assignmentExpression = Expression.Assign(targetMemberExpression, valueExpression);

これについてどうすればよいですか?

現時点では、すべての代入式を に配置してExpression.Blockいますが、インスタンスをこのブロックに渡す方法がわかりません。ParameterExpressions が必要ですが、インスタンスを渡していません。構築する必要がある型を渡しています。

4

1 に答える 1

2

何かのようなもの:

Type targetType = typeof(MyClass);

var obj = Expression.Variable(targetType);

var creatorExpression = Expression.New(targetType);
var assign = Expression.Assign(obj, creatorExpression);

var prop = Expression.PropertyOrField(obj, "MyProp1");
var value = Expression.Constant(5);
var member = Expression.Assign(prop, value);

var block = Expression.Block(new[] { obj }, creatorExpression, assign, member);

それが であることを覚えておく必要Expression.New(targetType)があるnew something()ため、別の場所で直接使用すると、毎回オブジェクトを再作成することになります。あなたはしたくない:

new MyClass().MyProp1 = 5;
new MyClass().MyProp2 = 6;

あなたが欲しい

var obj = new MyClass(); // assign + creatorExpression 
obj.MyProp1 = 5; // member + prop + value
obj.MyProp2 = 6; // not in the example

アクセスしているプロパティ/フィールドがプロパティまたはフィールドであることがわかっている場合は、 または を使用できExpression.PropertyますExpression.Field。どちらも、リフレクションによって取得できるstringプロパティ/フィールド名またはPropertyInfo/として受け入れます。MethodInfo

割り当てを行い、割り当てを含むブロックを返す関数がある場合は、次のobjような式を渡すことができます。

BlockExpression MakeSomeAssignments(ParameterExpression obj, Expression value1, int value2)
{
    var prop1e = Expression.PropertyOrField(obj, "MyProp1");
    var member1e = Expression.Assign(prop1e, value1e);

    var prop2e = Expression.PropertyOrField(obj, "MyProp2");
    var value2e = Expression.Constant(value2);
    var member2e = Expression.Assign(prop2e, value2e);

    return new Expression.Block(member1e, member2e);
}
于 2013-08-12T10:43:23.017 に答える