gpt4 book ai didi

c# - 链式方法反射执行

转载 作者:太空宇宙 更新时间:2023-11-03 22:47:36 25 4
gpt4 key购买 nike

我需要使用反射执行一些链式方法。

我想要获取的是未知编译类型的 Entity Core DBContext 集的 IQueryable:

var type = typeof(x);
this.DBContext.Set(type).AsQueryable();

显然,该代码无法编译,因为 Set 是一个泛型方法,其类型必须在编译时定义:

this.DBContext.Set<TUnknownType>().AsQueryable();

为了解决这个问题,我尝试使用反射来执行这些方法:

    MethodInfo dbSetMethod = typeof(DbContext).GetMethod(nameof(DbContext.Set));
MethodInfo generic = dbSetMethod.MakeGenericMethod(property.DeclaringType);

var asQueryableMethod = generic.ReturnType.GetMethod("AsQueryable");
var result = asQueryableMethod.Invoke(this.DbContext, null);

但是当我调试代码时,我在该行中得到一个空值:

var asQueryableMethod = generic.ReturnType.GetMethod("AsQueryable");

显然,dbContext.Set<TUnknownType>()没有 AsQueryable 方法。我猜该方法是来自 Linq 的扩展方法。

我错过了什么?为什么方法不可用?

最佳答案

没错,DbSet<T>工具 IQueryable<T> ,它公开了 AsQueryable<T>() extension method .

C# 提供了两种调用扩展方法的方法——作为实例方法,即

this.DBContext.Set<UnknownType>().AsQueryable();

或者作为静态方法,即

Queryable.AsQueryable(this.DBContext.Set<UnknownType>());

另一方面,反射 API 仅支持第二种方法,即获取和调用方法的静态方法方式。你应该得到 MethodInfo对于通用 Queryable.AsQueryable , 并传递给它一个适当的泛型类型参数来生成 MethodInfo适合调用的对象。

关于c# - 链式方法反射执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49160003/

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