与Generics和Linq相关的问题
本文关键字:问题 Linq Generics | 更新日期: 2023-09-27 18:22:31
我得到了类名列表如下:
Type[] typelist = typeof(Sample.Students).Assembly.GetTypes();
现在,我已经在示例名称空间中列出了所有可用类的完整列表
现在我想通过类获取数据我正在使用Devexpress Persistance类所以基本上我必须创建XPQuert对象如下:
XPQuery<Employee> EmployeeQuery = new XPQuery<Employees>(XPODefault.Session);
但在我的情况下,Employee
类将列在typelist
变量中。。如何创建XPQuery的对象。。有可能是这样的吗:
XPQuery<typeof(typelist[0].Name)> EMployeeQuery = new XPQuery<typeof(typelist.Name)> (XPODefault.Session);
我的意思是我想动态地创建对象。。我该怎么办谢谢
您可以执行以下操作:
public static IQueryable CreateQueryInstance(Type queryType)
{
var genericQueryTypeDefinition = typeof(XPQuery<>);
var queryTypeArguments = new[] { typeof(queryType) };
var genericQueryType = genericQueryTypeDefinition.MakeGenericType(queryTypeArguments);
var queryObject = (IQueryable)Activator.CreateInstance(genericQueryType, <your parameters here>);
return queryObject;
}
然后将其用作:
var myQueryObject = CreateQueryInstance(typelist[0]);
当然,您将无法拥有一个好的XPQuery,因为您在编译时不知道类型,但您仍然可以从IQueryable开始。
您可以使用反射来动态构造泛型类型。
Type queryType = typeof(XPQuery<>);
Type[] typeArgs = { typelist[0] };
Type constructed = queryType .MakeGenericType(typeArgs);
object myQuery = Activator.CreateInstance(constructed, XPODefault.Session);
您需要使用CreateInstance(类型,params Object[]args)重载,以便指定构造函数所需的参数。
唯一的问题是返回的CreateInstance
的类型是object
。如果要在myQuery
上调用任何其他方法,则需要使用反射或dynamic
关键字。