我正在尝试构建一个调用LINQ的Any()方法的Expression,而我似乎无法找到传递给Type.GetMethod()的正确参数。
从文档来看,看起来Any()是作为Enumerable类的一个成员实现的,这似乎有效,因为这显示了名为“Any”的方法:
var enumerableType = typeof (Enumerable);
var foo = enumerableType.GetMethods().Where(m => m.Name == "Any").ToList();
当我为名为“Any”的方法时,我得到一个AmbiguousMatchException。
有两个Any()方法,在Enumerable中,一个接受IEnumerable,另一个接受IEnumerable和Func。我想要第二个,理论上,我需要做的就是传递一个包含两种类型的数组:
var bar = enumerableType.GetMethod("Any", new[] { typeof(IEnumerable<>), typeof(Func<,>) });
但是这总是返回null。
我做错了什么?
答案 0 :(得分:6)
var foo = enumerableType.GetMethods(BindingFlags.Static | BindingFlags.Public)
.First(m => m.Name == "Any" && m.GetParameters().Count() == 2);
答案 1 :(得分:5)
如果您希望明确确保您对带有IEnumerable<>
和Func<,>
参数的重载进行匹配,则可以使用以下内容(改编自this answer):
var enumerableType = typeof(Enumerable);
var bar =
(
from m in enumerableType.GetMethods(BindingFlags.Static | BindingFlags.Public)
where m.Name == "Any"
let p = m.GetParameters()
where p.Length == 2
&& p[0].ParameterType.IsGenericType
&& p[0].ParameterType.GetGenericTypeDefinition() == typeof(IEnumerable<>)
&& p[1].ParameterType.IsGenericType
&& p[1].ParameterType.GetGenericTypeDefinition() == typeof(Func<,>)
select m
).SingleOrDefault();