You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何无法通过参数类型查找特定泛型方法?

问题:反射获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 11:57:22