如何将Expression.Call()返回的值赋给ParameterExpression?

时间:2016-04-18 17:17:46

标签: c# generics reflection expression-trees

我有以下代码:

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. 返回实例
  5. 问题是:当我编译并调用表达式时,从不调用Instantiate()。返回的值始终为null:

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

1 个答案:

答案 0 :(得分:0)

我的坏。我忘了Expression.Assign()会返回一个表达式。

当这样做时,它可以很好地运作:

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

感谢Luaan的提示。