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(); }