2013-08-12 42 views
0

如果我在外部表達式樹已宣佈:通行證值

var creatorExpression = Expression.New(targetType); 

我希望中的一個或其中賦值的屬性的子表達式來使用該新實例,例如:

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

我該如何解決這個問題?

此刻,我將所有賦值表達式放入Expression.Block,但我看不到將實例傳遞到此塊的方法。它需要ParameterExpressions,但我沒有傳入一個實例;我正在傳遞需要構建的類型。

回答

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.PropertyExpression.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); 
} 
+0

優秀。謝謝。它將新實例分配給我缺少的變量。許多通過文檔,我仍然錯過了'Expression.Variable'方法。非常感謝 – JRoughan