让我们看看这条线。给你打电话
Call
var call = Expression.Call(typeof(Enumerable), "Average", new[] { typeof(IEnumerable<T>) , typeof(Func<T, int>) }, parameter);
第三个参数是
“指定泛型方法的类型参数的Type对象数组。”
。你正在传递类型
IEnumerable<T>
和
Func<T, int>
但是
Average
takes only a single type parameter (
TSource
)
.
第四个参数是
“表示方法参数的Expression对象数组。”
。您正在传递一个表示
T
但是
平均的
需要一个
IEnumerable<TSource>
和一个
Func<TSource, decimal>
(或您想调用的任何重载,我只需使用
decimal
一个作为示例)。
我不知道你使用这段代码的最终目的是什么,但它可能看起来像:
PropertyInfo sortProperty = typeof(T).GetProperty("Prop");
ParameterExpression parameter = Expression.Parameter(typeof(T), "p");
MemberExpression propertyAccess = Expression.MakeMemberAccess(parameter, sortProperty);
// parameter for the source collection
ParameterExpression source = Expression.Parameter(typeof(IEnumerable<T>), "source");
var exp = Expression.Lambda<Func<T, decimal>>(propertyAccess, parameter);
var call = Expression.Call(typeof(Enumerable), "Average", new[] {typeof(T)}, source, exp);
下面是一个使用此代码的小示例(您会明白的):
// assuming a class called T with a decimal property called Prop
// because I'm a lazy and terrible person
var method = Expression.Lambda<Func<IEnumerable<T>, decimal>>(call, source).Compile();
var result = method(new List<T> {new T { Prop=10}, new T { Prop=20}});
// result is now 15