为何无法通过参数类型查找特定泛型方法?
问题:反射获取Queryable.Contains重载返回null的原因
System.Linq.Queryable类型包含名为Contains的两个重载方法:
bool Contains<TSource>(this IQueryable<TSource>, TSource)bool Contains<TSource>(this IQueryable<TSource>, TSource, IEqualityComparer<TSource>?)
我想要获取第一个重载,因此使用以下代码:
var queryableContainsMethod = typeof(Queryable).GetMethod( nameof(Queryable.Contains), new[] { typeof(IQueryable<T>), typeof(T), });
但代码返回null。这是为什么?
注意: 我并非询问如何获取该方法的引用;我想知道为什么我预期能获取到引用的代码无法实现。
原因解析
你这段代码返回null的核心问题是用错了反射查找方法的重载:
Type.GetMethod(string, Type[])这个重载的设计目标是查找非泛型方法,但Queryable.Contains是带有<TSource>类型参数的泛型方法,这个重载根本无法识别泛型方法的定义,自然找不到匹配项。
具体细节:
Queryable.Contains是一个泛型方法定义,它没有绑定到具体的类型,而是用TSource作为类型占位符。- 你传入的
typeof(IQueryable<T>)和typeof(T)是绑定到当前代码上下文里T的构造泛型类型,GetMethod的这个重载会去寻找一个非泛型方法,要求其参数类型完全和你传入的这两个类型一致——但这样的方法并不存在,所以返回null。
内容的提问来源于stack exchange,提问作者Ian Kemp - SO dead by AI greed
相关产品推荐
相关产品推荐

