4

当我有了这个,

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。我认为这无关紧要。我在这里哪里出错了?

4

1 回答 1

14

问题是你已经说过你想使用一个参数 - 但你实际上并没有提供任何地方来指定它。您正在创建两个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();

Note that the same ParameterExpression is used in the argument list for both theExpression.Call method and the Expression.Lambda methods.

于 2013-04-23T14:11:31.977 回答