【发布时间】:2019-04-11 14:21:45
【问题描述】:
我正在尝试提取 Count 方法,以便以后可以重用它来构建表达式树。
var g = Expression.Parameter(typeof(IEnumerable<float?>), "g");
var countMethod = typeof(Enumerable)
.GetMethods()
.Single(m => m.Name == "Count" && m.GetParameters().Count() == 1);
var countMaterialized = countMethod
.MakeGenericMethod(new[] { g.Type });
var expr = Expression.Call(countMaterialized, g);
它会抛出这个错误:
System.ArgumentException: 'System.Collections.Generic.IEnumerable1[System.Nullable1[System.Single]] 类型的表达式不能用于'System.Collections.Generic.IEnumerable1[System.Collections.Generic.IEnumerable1[ System.Nullable1[System.Single]]]' of method 'Int32 Count[IEnumerable1](System.Collections.Generic.IEnumerable1[System.Collections.Generic.IEnumerable1[System.Nullable1[System.Single]]])''
我错过了什么?
【问题讨论】:
-
泛型的类型参数应该是
float?,而不是IEnumerable<float?>。猜猜哪个g.Type回来了? -
如果您查看
Enumerable.Count<TSource>的声明,您会发现TSource不是IEnumerable<T>,而只是IEnumerable中的项目类型,因此将MakeGenericMethod更改为使用@ 987654334@ 而不是g.Type。 -
在将 typeof(float?) 放入 MakeGenericMethod 后它起作用了
标签: c# linq generics reflection expression