gpt4 book ai didi

c# - 获取任意 IQueryable 上 Count() LINQ 扩展方法的 MethodInfo

转载 作者:太空狗 更新时间:2023-10-29 18:23:06 28 4
gpt4 key购买 nike

我有 IQueryable 源,我想动态调用 IQueryable .Count()。

因此,我需要在 IQueryable 中声明的 Count 方法的 MethodInfo。

这是来自 msdn 的签名(在 IQueryable<> 中):

public static int Count<TSource>(
this IQueryable<TSource> source
)

这是我得到的结果:

Expression expr; //this is expression which holds my IQueryable<T>
MethodInfo mi = expr.Type.GetMethod("Count", BindingFlags.Static | BindingFlags.Public, null, new[] { expr.Type }, null);

但是我的mi一直是null;

我也试过:

mi = typeof(IQueryable<>).GetMethod("Count", BindingFlags.Static | BindingFlags.Public, null, new[] { expr.Type }, null);

但还是空的。

我的最终目标是:

Expression.Call(mi, expr);

更新:这就是我获得 Sum Extension 方法的方式:

MethodInfo sum = typeof(Queryable).GetMethod("Sum", BindingFlags.Static | BindingFlags.Public, null, new[] { typeof(IQueryable<decimal>) }, null);

这可行,但是这个 Sum 方法不是通用的。它虽然是静态的。

最佳答案

你需要破解 IQueryable<T> 的通用参数输入并使用它;拥有该方法的类型也不是 IQueryable<T> , 它是 Queryable - 如果您考虑一下 - 接口(interface)不能有静态方法(好吧,正如评论者所指出的,在 C# 中就是这样):)。

此外,因为它是一个泛型方法,所以您无法按照您尝试过的方式匹配参数:因为您需要传递泛型类型定义 IQuerable<TSource> - 不是通用类型 IQueryable<int>或者无论实际表达是什么。

相反,您可以在 Queryable 上查找名为“Count”的静态方法的单参数版本。输入:

Type genericArgument = expr.GetGenericArguments()[0];

MethodInfo countMethod = typeof(Queryable)
.GetMethods(BindingFlags.Static | BindingFlags.Public)
//narrow the search before doing 'Single()'
.Single(mi => mi.Name == "Count"
// this check technically not required, but more future proof
&& mi.IsGenericMethodDefinition
&& mi.GetParameters().Length == 1)
.MakeGenericMethod(genericArgument);

//now you can bind to 'countMethod'

2017 年 3 月 7 日更新 - 显然,框架中发生了一些变化,导致原始版本的代码示例无法运行 - 这是一个更新版本应该工作

再深入一点——方法的签名是:

public static int Count<TSource>(
this IQueryable<TSource> source
)

所以虽然参数类型是IQueryable<TSource>它在 TSource 上是通用的类型 - 因此你需要进入你的 IQueryable<TSource> 的原因表达式并捕获它的通用参数。你也应该能够在这里看到我关于参数的意思。

关于c# - 获取任意 IQueryable<T> 上 Count() LINQ 扩展方法的 MethodInfo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10277143/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com