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

Jef*_*ege 5 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();
Run Code Online (Sandbox Code Playgroud)

当我为名为"Any"的方法时,我得到一个AmbiguousMatchException.

有两个Any()方法,在Enumerable中,一个接受IEnumerable,另一个接受IEnumerable和Func.我想要第二个,理论上,我需要做的就是传递一个包含两种类型的数组:

var bar = enumerableType.GetMethod("Any", new[] { typeof(IEnumerable<>), typeof(Func<,>) });
Run Code Online (Sandbox Code Playgroud)

但是这总是返回null.

我究竟做错了什么?

EZI*_*EZI 6

var foo = enumerableType.GetMethods(BindingFlags.Static | BindingFlags.Public)
            .First(m => m.Name == "Any" && m.GetParameters().Count() == 2);
Run Code Online (Sandbox Code Playgroud)

  • `m.GetParameters().Count()== 2`对于可移植性可能不太安全(例如,迁移到更高版本的框架).您可能想要检查方法的实际参数是什么. (2认同)

Dou*_*las 5

如果你想特别确保你匹配过载IEnumerable<>Func<,>参数,你可以使用以下(改编自这个答案):

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();
Run Code Online (Sandbox Code Playgroud)