我正在编写一个处理数据表结构分页的查询插件,为了尽可能简化维护,我在插件中传递模型的名称并通过给定的模型进行查询名。
问题是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 :(得分:1)
你在这里看到的是,通过从t
个对象的集合中取出Type
,它实际上不是一个类型,并且对于通用方法。 Type
class是表示类型元数据的对象,而不是编译器可识别的用于泛型的类型。由于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);
});