2016-04-18 45 views
1

我有以下代碼:如何將Expression.Call()返回的值分配給ParameterExpression?

var factory = Expression.Parameter(typeof(FooFactory)); 
var fooInstance = Expression.Variable(typeof(Foo)); 

var factoryCall = Expression.Call(factory, "Instantiate", new[] { typeof(Foo) }); 
Expression.Assign(fooInstance, factoryCall); 

List<Expression> expressions = new List<Expression>(); 
// TODO : add more expressions to do things on fooInstance ...// 

expressions.Add(fooInstance); //return fooInstance 
Expression finalExpr = Expression.Block(new[] { fooInstance }, expressions); 

什麼是應該做的事:給定的參數

  1. 使用工廠,並呼籲Instantiate<T>()方法就可以了。
  2. 將返回值(一個foo實例)存儲到本地變量中。
  3. 請在局部變量(在這個例子裏缺)
  4. 返回實例事情

的問題是:當我編譯並調用表達,實例化()不會被調用。返回的值始終爲空:

var method = Expression.Lambda<Func<FooFactory, Foo>>(finalExpr, factory).Compile(); 
Foo foo = method(new FooFactory()); //foo is null :(
+2

你把這項任務扔掉了。表達樹是純粹的說明性的,沒有副作用。 – Luaan

回答

0

我的不好。我忘記Expression.Assign()返回一個表達式。

在這樣做時,相反,它精美的作品:

List<Expression> expressions = new List<Expression>(); 
expressions.Add(Expression.Assign(fooInstance, call)); 

感謝Luaan的小費。

相關問題