【问题标题】:Calling parameterised constructor using compiled expression使用编译表达式调用参数化构造函数
【发布时间】:2014-02-27 09:50:11
【问题描述】:

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

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();

我相信我收到了异常,因为参数“值”不在 Expression.Block 范围内。

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

【问题讨论】:

  • 你能用 ctor 发布类型定义吗?

标签: c# .net reflection expression-trees


【解决方案1】:

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

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

【讨论】:

  • 这不太行,我已经在下面发布了答案
  • @AwkwardCoder:很高兴听到它现在可以工作。但是,我看不出我的答案有什么不同。相关的更改似乎是将param 添加到Expression.Lambda 的调用中作为额外参数。无论如何,如果它有效,它就会有效。
  • @AwkwardCoder:感谢您的仔细检查 - 我真的不明白其中的区别,因为我之前也检查过我的解决方案,但无法确定相关的区别。祝你有美好的一天!
猜你喜欢
  • 2017-06-27
  • 1970-01-01
  • 2020-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多