IQueryable<out T> 其中只有 class 名称已知
IQueryable<out T> Where only class name is known
我有:
session.Query<Symptom>().First();
我想做什么:
var className="Symptom"
session.Query<className>().First()
是否可以通过某种方式做到这一点?如果是的话去哪里看,因为我试过 Type.GetType
等,但没有成功。第二个问题,我必须通过网络请求 "type" 发送,这将在该查询语法中,我看起来很好吗?或者我遗漏了一些点,我可以从前端以某种方式将类型发送到服务并从数据库中获取我想要的数据。我正在使用该查询从 Nhibernate 获取数据,并且我不想对请求数据附带的所有可能类型进行硬编码。
编辑:
当我尝试 GetType 时,我得到:
cannot apply operator '<' to operands of type 'method group' and 'system.type'
通用参数是编译类型构造。在您的情况下,您指定一个字符串(runtine 实体)作为类型名称,因此您需要在运行时通过反射创建一个封闭的泛型方法实例。
下一个代码演示了这一点:
假设我有:
public void Query<T>()
{
Console.WriteLine("Called Query with type: {0}", typeof(T).Name);
}
现在为了用某种类型调用它,我需要创建一个具有该类型的方法实例:
//type you need to create generic version with
var type = GetType().Assembly //assumes it is located in current assembly
.GetTypes()
.Single(t => t.Name == "MyType");
//creating a closed generic method
var method = GetType().GetMethod("Query")
.GetGenericMethodDefinition()
.MakeGenericMethod(type);
//calling it on this object
method.Invoke(this, null); //will print "Called Query with type: MyType"
这是ideone上的full code。
我有:
session.Query<Symptom>().First();
我想做什么:
var className="Symptom"
session.Query<className>().First()
是否可以通过某种方式做到这一点?如果是的话去哪里看,因为我试过 Type.GetType
等,但没有成功。第二个问题,我必须通过网络请求 "type" 发送,这将在该查询语法中,我看起来很好吗?或者我遗漏了一些点,我可以从前端以某种方式将类型发送到服务并从数据库中获取我想要的数据。我正在使用该查询从 Nhibernate 获取数据,并且我不想对请求数据附带的所有可能类型进行硬编码。
编辑:
当我尝试 GetType 时,我得到:
cannot apply operator '<' to operands of type 'method group' and 'system.type'
通用参数是编译类型构造。在您的情况下,您指定一个字符串(runtine 实体)作为类型名称,因此您需要在运行时通过反射创建一个封闭的泛型方法实例。
下一个代码演示了这一点:
假设我有:
public void Query<T>()
{
Console.WriteLine("Called Query with type: {0}", typeof(T).Name);
}
现在为了用某种类型调用它,我需要创建一个具有该类型的方法实例:
//type you need to create generic version with
var type = GetType().Assembly //assumes it is located in current assembly
.GetTypes()
.Single(t => t.Name == "MyType");
//creating a closed generic method
var method = GetType().GetMethod("Query")
.GetGenericMethodDefinition()
.MakeGenericMethod(type);
//calling it on this object
method.Invoke(this, null); //will print "Called Query with type: MyType"
这是ideone上的full code。