2014-10-29 53 views
0

我正在编写一个处理数据表结构分页的查询插件,并为了尽可能保持维护尽可能简洁,我通过名称插件中的模型,并通过给定的模型名称进行查询。如何将字符串转换为MongoDB查询的类型

问题是,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但绝对是一种类型,任何想法?

+0

't'是不是一个类型,它是一个对象(类型System.Type),持有关于类型的信息。你不能使用t作为泛型类型参数。 – helb 2014-10-29 15:18:03

回答

1

什么你看到的是,通过采取tType对象的集合,它实际上是一个类型,是无效的通用方法。 Type class是表示类型的元数据的对象,而不是编译器可识别的用于泛型的类型。由于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); 
    }); 
相关问题