我正在尝试从表达式调用参数化构造函数,而不是使用默认构造函数。这是获取构造函数参数的代码:
ConstructorInfo ci = type.GetConstructor(BindingFlags.Instance | BindingFlags.Public, null, CallingConventions.HasThis, new[] { typeof(bool) }, new ParameterModifier[] { });
ParameterInfo[] paramsInfo = ci.GetParameters();
//create a single param of type object[]
ParameterExpression param = Expression.Parameter(typeof(bool), "il");
Expression[] argsExp = new Expression[paramsInfo.Length];
//pick each arg from the params array
//and create a typed expression of them
for (int i = 0; i < paramsInfo.Length; i++)
{
Expression index = Expression.Constant(i);
Type paramType = paramsInfo[i].ParameterType;
Expression paramAccessorExp = param;
//Expression.ArrayIndex(param, index);
Expression paramCastExp =
Expression.Convert(paramAccessorExp, paramType);
argsExp[i] = param;
}
NewExpression ci2 = Expression.New(ci, argsExp);
但是如果我尝试编译 lambda 表达式,我会收到以下错误:
variable 'il' of type 'System.Boolean' referenced from scope '', but it is not defined"
我错过了什么?感谢任何帮助和/或提示。
最佳答案
您在代码的第 4 行定义了一个名为 li
的参数。为了在 lambda 表达式中使用它,您需要有一个定义此参数的范围。您有两个选择:
- 创建一个包含
param
作为局部变量的BlockExpression
。然后使用此表达式作为您的 lambda 表达式的主体。 - 在您的
LambdaExpression
中使用param
作为参数。
如果您使用选项 1,您还必须初始化变量。否则,您会收到不同类型的错误消息。
编辑
您发布的附加代码有两个问题:
您需要在整个表达式树中使用相同的参数对象。具有相同的名称和类型并不会使两个
Parameter
对象相等。我会简单地将所有内容移动到ConvertThis
方法并包括创建 lambda,这样您就可以重用param
变量。然后,您只需编译ConvertThis
的返回值即可获取您的委托(delegate)。创建
BlockExpression
时,需要将param
作为局部变量传入。为此,您可以向该方法添加一个参数new ParameterExpression[] { param }
。
关于c# - 表达式使用参数调用构造函数并设置其值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8169672/