如何将字符串转换为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但它绝对是一种类型,有什么想法吗?

如何将字符串转换为MongoDB查询的类型

您在这里看到的是,通过从Type对象的集合中取出t,它实际上不是类型,对泛型方法无效。Type类是一个表示类型元数据的对象,而不是编译器可识别的用于泛型的类型。由于tType类的一个实例,因此无法识别它。

唯一可以传递给泛型方法的是传递到当前作用域中的其他类型参数(通过类或方法泛型参数)或编译时常数类型。

如果你想在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);
    });