X是一个变量,但在尝试投射时使用的类似

我传递了一个我要查询的实体类型名称的字符串,并根据字符串获取类型。 我想让DbSet返回并返回IQueryable 。 问题是我在做什么(DbSet)并得到以下错误:

tableEntity是一个变量,但像类型一样使用

当试图施放。 有办法解决这个问题吗?

 public object GetList(string tableEntity) { Type tableEntity = Type.GetType("TestProject." + typeName + ", TestProject"); var dbObject = (DbSet)typeof(DbContext).GetMethod("Set", Type.EmptyTypes) .MakeGenericMethod(tableEntity) .Invoke(databaseContext, null); return dbObject.AsQueryable(); } 

编辑

只是要添加我无法访问我们通过字符串传递名称的类型。

事实certificate,在编译时,实体类型在字面上是未知的或可知的。 它必须是一个字符串。

您在编译时使用该类型的唯一位置是转换为(DbSet) 。 好吧,你可能不需要那个。 从该类型中需要的只是调用AsQueryable() ,而AsQueryable()IEnumerable的扩展方法,具有generics和非generics版本。 如果我们通过非通用的IEnumerable调用它,那就是非generics的AsQueryable() ,返回非generics的IQueryable 。 但是我们无论如何都要回归object ,所以嘿。 为了使这个东西变得有用,某些东西必须在它上面进行相当多的反思,所以声明的类型可能没那么重要。

看看这是否有效:

 public object GetList(string tableEntity) { Type tableEntity = Type.GetType("TestProject." + typeName + ", TestProject"); var dbObject = (System.Collections.IEnumerable) typeof(DbContext).GetMethod("Set", Type.EmptyTypes) .MakeGenericMethod(tableEntity) .Invoke(databaseContext, null); return dbObject.AsQueryable(); } 

如果事实certificate你需要通用的IQueryable ,我们将不得不使用reflection为未知(在编译时)实体类型获取AsQueryable MethodInfo ,并在其上调用MakeGenericMethod(tableEntity)


第一次尝试:

在该语言中,generics的类型参数必须是实际类型 ,而不是Type类的实例。 那是因为它们在编译时得到了解决。

但这没问题; 要将类型参数传递给generics方法,只需使用类型参数编写generics方法即可。

你不能这样做:

 var stuff = GetList("MyTableEntityClass"); 

但这也很好:

 var stuff = GetList(); 

 public object GetList() { var dbObject = (DbSet)typeof(DbContext) .GetMethod("Set", Type.EmptyTypes) .MakeGenericMethod(typeof(TTableEntity)) .Invoke(databaseContext, null); return dbObject.AsQueryable(); } 

反思是不同的; 这就是我们将typeof(TTableEntity)传递给MakeGenericMethod()

一旦我们使用了编译器可以检查的实际类型,我们也可以使用返回类型做得更好:

 public IQueryable GetList() { var dbObject = (DbSet)typeof(DbContext) .GetMethod("Set", Type.EmptyTypes) .MakeGenericMethod(typeof(TTableEntity)) .Invoke(databaseContext, null); return dbObject.AsQueryable(); } 

因为,正如Ed所说,你不在编译时使用表实体类型,为什么不使用非generics的databaseContext.Set (tableEntity).AsQueryable () ? 但如果你已经把心放在Set<> ,试试这个:

 public object GetList(string tableEntity) { Type tableEntity = Type.GetType("TestProject." + typeName + ", TestProject"); return GetType () .GetMethod ("GetListHelper") .MakeGenericMethod (tableEntity) .Invoke (this) ; } public object GetListHelper () where T : class { var dbObject = databaseContext.Set (null) ; return dbObject.AsQueryable(); }