C# 链式方法反射执行

C# 链式方法反射执行,c#,reflection,C#,Reflection,我需要使用反射执行一些链式方法 我试图得到的是一个未知编译类型的实体核心DBContext集的IQueryable: var type = typeof(x); this.DBContext.Set(type).AsQueryable(); 显然,该代码不会编译,因为Set是一个泛型方法,必须在编译时定义类型: this.DBContext.Set<TUnknownType>().AsQueryable(); 但是当我调试代码时,我在行中得到一个空值: var asQueryab

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

我试图得到的是一个未知编译类型的实体核心DBContext集的IQueryable:

var type = typeof(x);
this.DBContext.Set(type).AsQueryable();
显然,该代码不会编译,因为Set是一个泛型方法,必须在编译时定义类型:

this.DBContext.Set<TUnknownType>().AsQueryable();
但是当我调试代码时,我在行中得到一个空值:

var asQueryableMethod = generic.ReturnType.GetMethod("AsQueryable");
显然,
dbContext.Set()
没有AsQueryable方法。我想这个方法是来自Linq的一个扩展方法

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

没错,
DbSet
实现了
IQueryable
,它公开了
AsQueryable()

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

this.DBContext.Set<UnknownType>().AsQueryable();
Queryable.AsQueryable(this.DBContext.Set<UnknownType>());
this.DBContext.Set().AsQueryable();
或者作为静态方法,即

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

另一方面,反射API只支持第二种方法,即获取和调用方法的静态方法。您应该为generic
Queryable.AsQueryable
获取
MethodInfo
,并向其传递适当的泛型类型参数,以使
MethodInfo
对象适合调用。

当您谈到动态类型时,您的确切意思是什么?后期绑定动态类型、封闭泛型类型、仅运行时类型?为什么选择向下投票?这是一个明确的问题。动态类型意味着在运行时之前未知的类型。可能的重复可以用其他方式来表示:第一种方式是语法糖,由编译器解析,第二种方式是语法糖。好的,我明白了。我正在尝试,但是如何将dbSetGeneric方法作为参数传递给Queryable.AsQueryable()方法?我一直在尝试,但无法让它工作。@Andres用一个参数获取
Queryable.AsQueryable
的方法信息。对其调用
MakeGenericMethod
,传递参数的
property.DeclaringType
。您应该能够调用结果
MethodInfo
@dasblinkenlight我已经得到了如下方法:
MethodInfo asQueryableMethod=typeof(Queryable).GetMethods()。其中(x=>x.Name==“AsQueryable”&&&!x.IsGenericMethod).First()但其参数是泛型方法信息。我需要创建一个methodinfo来表示:
Queryable.AsQueryable(this.DBContext.Set())。如何将
Set()
方法作为参数传递?