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.
我究竟做错了什么?
var foo = enumerableType.GetMethods(BindingFlags.Static | BindingFlags.Public)
.First(m => m.Name == "Any" && m.GetParameters().Count() == 2);
Run Code Online (Sandbox Code Playgroud)
如果你想特别确保你匹配过载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)