c# - "Incorrect number of parameters supplied for lambda declaration"

标签 c# expression expression-trees func

<分区>

当我有这个的时候,

public static object Create()
{
    return new object();
}

这个有效:

var m = typeof(Class).GetMethod("Create");
var e = Expression.Call(m);
Func<object> f = Expression.Lambda<Func<object>>(e).Compile();

但是当我有这个的时候,

public static object Create(Type t)
{
    return new object();
}

这失败了:

var m = typeof(Class).GetMethod("Create");
var e = Expression.Call(m, Expression.Parameter(typeof(Type)));
var t = Expression.Parameter(typeof(Foo));
Func<object> f = Expression.Lambda<Func<object>>(e, t).Compile();

我得到 System.Core.dll 中出现类型为“System.ArgumentException”的未处理异常。附加信息:为 lambda 声明提供的参数数量不正确。参数 t 只是一个虚拟类型 Foo 的表达式。我认为这无关紧要。我哪里出错了?

最佳答案

问题是您已经说过要使用一个参数 - 但实际上您并没有提供任何地方来指定它。你正在创建两个 ParameterExpression s 不同类型,然后尝试将结果转换为 Func<object> - 根本没有任何参数。你想要这样的东西:

var m = typeof(Class).GetMethod("Create");
var p = Expression.Parameter(typeof(Type), "p");
var e = Expression.Call(m, p);
Func<Type, object> f = Expression.Lambda<Func<Type, object>>(e, p).Compile();

注意相同的ParameterExpressionExpression.Call 的参数列表中使用方法和 Expression.Lambda方法。

关于c# - "Incorrect number of parameters supplied for lambda declaration",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16171451/

相关文章:

c# - 未找到以下命令 netsh

c# - 具有格式/文化的表达式树 ToString

c# - 如何使用闭包对象作为参数创建一个调用(或结合)另一个表达式的表达式?

python - 删除表达式树中第一个元素及其在 Python 中的每个子表达式树中的括号

c# - Expression.Lambda 泛型中的非特定类型

c# - 如何终止递归函数并返回值

c# - 控制台输出的自定义格式

c# - Entity Framework 6-使用我的getHashCode()

haskell - 是否可以使用 Template Haskell 获得任何类型的表达式?

Java - 计算大型数学表达式