为何用Reflection的GetMethod无法获取Enumerable.Select方法?
问题原因分析
你用GetMethod直接获取Enumerable.Select失败的核心原因是:Select是泛型方法,而你传入的开放泛型类型和方法实际的参数类型不匹配。
具体来说:
Enumerable.Select的实际定义是一个带两个类型参数的泛型方法:
它的两个参数是已经绑定了类型参数的构造泛型类型(public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector);IEnumerable<TSource>和Func<TSource, TResult>),而不是你传入的开放泛型类型(IEnumerable<>、Func<,>)。GetMethod的这个重载要求传入的参数类型必须和方法定义的参数类型完全一致,开放泛型和构造泛型属于不同的类型,自然匹配失败,返回null。
你尝试的其他类型也不对:
typeof(IEnumerable)是非泛型接口,和Select的第一个参数IEnumerable<TSource>(泛型)不匹配;typeof(Enumerable)是静态类类型,和方法参数完全无关。
而你遍历方法的方式能成功,是因为你先筛选出了Select的开放泛型方法定义(名字为Select、参数个数为2的那个方法),然后通过MakeGenericMethod为它绑定具体的类型参数,这才是获取泛型方法的正确路径之一。
内容的提问来源于stack exchange,提问作者ferry
相关产品推荐
相关产品推荐

