如何将字符串转换为MongoDB查询的类型
本文关键字:MongoDB 查询 类型 转换 字符串 | 更新日期: 2023-09-27 18:28:13
我正在编写一个查询插件,该插件处理数据表结构的分页,为了尽可能减少维护,我在插件中传递模型的名称,并通过给定的模型名称进行查询。
问题是Mongo驱动程序需要查询的集合的类型,而不是字符串形式的名称。我相信我在使用反射获取类型方面已经取得了很好的进展,但是当我传入类型时,我得到了一个无法访问类型(t
)的错误:
public ActionResult ListTablePartial(string modelName, int pageAmount)
{
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
foreach (Assembly assembly in assemblies)
{
IEnumerable<Type> types = from x in assembly.GetTypes() select x;
foreach (var t in types)
{
if (t.Name == modelName)
{
var data = _dataService.GetCollectionQueryModel<t>(
Query.And(
Query.EQ("IsActive", true),
Query.GTE("CreateDate", DateTime.Now.AddDays(-7)),
Query.LTE("CreateDate", DateTime.Now.AddHours(23))))
.OrderByDescending(c => c.CreateDate);
}
}
}
}
错误在这里:_dataService.GetCollectionQueryModel<t>
cannot resolve symbol t
但它绝对是一种类型,有什么想法吗?
您在这里看到的是,通过从Type
对象的集合中取出t
,它实际上不是类型,对泛型方法无效。Type
类是一个表示类型元数据的对象,而不是编译器可识别的用于泛型的类型。由于t
是Type
类的一个实例,因此无法识别它。
唯一可以传递给泛型方法的是传递到当前作用域中的其他类型参数(通过类或方法泛型参数)或编译时常数类型。
如果你想在Type
的实例中使用泛型,你可以这样做,但它需要使用一些反射而不是简单的组合:
var data = _dataService
.GetType()
.GetMethod("GetCollectionQueryModel")
.MakeGenericMethod(t)
.Invoke(_dataService, new object[]
{
Query.And(
Query.EQ("IsActive", true),
Query.GTE("CreateDate", DateTime.Now.AddDays(-7)),
Query.LTE("CreateDate", DateTime.Now.AddHours(23))))
.OrderByDescending(c => c.CreateDate);
});