gpt4 book ai didi

c# - X 是一个变量,但在尝试转换时像类型一样使用

转载 作者:行者123 更新时间:2023-11-30 20:17:38 26 4
gpt4 key购买 nike

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

tableEntity is a variable but used like a type

尝试转换时。有办法解决这个问题吗?

public object GetList(string tableEntity)
{
Type tableEntity = Type.GetType("TestProject." + typeName + ", TestProject");

var dbObject = (DbSet<tableEntity>)typeof(DbContext).GetMethod("Set", Type.EmptyTypes)
.MakeGenericMethod(tableEntity)
.Invoke(databaseContext, null);

return dbObject.AsQueryable();
}

编辑

只是补充一下,我无法访问我们通过字符串传递名称的类型。

最佳答案

因此事实证明实体类型在编译时实际上是未知的或可知的。它必须是一个字符串。

您在编译时唯一使用该类型的地方是在转换为 (DbSet<tableEntity>) 时.好吧,你可能不需要那个。您需要从该类型中调用 AsQueryable() , 和 AsQueryable()IEnumerable 的扩展方法,具有通用和非通用版本。如果我们通过非泛型调用它 IEnumerable ,那是非泛型 AsQueryable() , 返回非泛型 IQueryable .但我们正在返回 object无论如何,嘿。为了使这个东西的结果有用,某处的某些东西无论如何都必须对其进行相当多的反射,因此声明的类型可能没有什么影响。

看看这是否有效:

public object GetList(string typeName)
{
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();
}

如果事实证明您需要通用 IQueryable<TEntityType> ,我们必须使用反射来获取 MethodInfo对于 AsQueryable<TEntityType>对于未知(在编译时)实体类型,并调用 MakeGenericMethod(tableEntity)在那上面。


第一次尝试:

在该语言中,泛型的类型参数必须是实际类型,而不是 Type 的实例类(class)。那是因为它们是在编译时解决的。

但这没问题;要将类型参数传递给泛型方法,只需编写一个带有类型参数的泛型方法。

你不能这样做:

var stuff = GetList("MyTableEntityClass");

但这同样好:

var stuff = GetList<MyTableEntityClass>();

...

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

return dbObject.AsQueryable();
}

反射不同;这就是我们通过 typeof(TTableEntity) 的原因至 MakeGenericMethod() .

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

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

return dbObject.AsQueryable();
}

关于c# - X 是一个变量,但在尝试转换时像类型一样使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44207451/

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