为LINQ的Any()方法获取MethodInfo?

时间:2014-08-05 19:57:17

标签: c# linq reflection

我正在尝试构建一个调用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。

我做错了什么?

2 个答案:

答案 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();