使用编译表达式调用参数化构造函数

时间:2014-02-27 09:50:12

标签: c# .net reflection expression-trees

我正在尝试创建一个已编译的表达式委托来调用一个带有单个参数的构造函数,我收到以下异常:

Additional information: variable 'value' of type 'MyType' referenced from scope '', but it is not defined

代码如下:

var constructorInfo = instanceType.GetConstructors().Skip(1).First();

ParameterExpression param = Expression.Parameter(genericArgument, "value");
Delegate constructorDelegate = Expression.Lambda(Expression.New(constructorInfo, new Expression[] { param })).Compile();

我相信我正在接收异常,因为参数'value'没有限定在Expression.Block中。

如何确定参数范围& Expression.Block中的构造函数表达式?

1 个答案:

答案 0 :(得分:7)

为了声明参数value,您还需要在创建Lambda表达式时指定它(请参阅Expression.Lambda方法的此overload)。到目前为止,您只创建一个参数化的lambda表达式,但不声明表达式中使用的参数。更改代码应解决问题:

var lambdaExpr = Expression.Lambda(Expression.New(constructorInfo, 
                                                  new Expression[] { param }), 
                                   param);
Delegate constructorDelegate = lambdaExpr.Compile();
相关问题