如何使用从不同方法返回的类型调用泛型方法?
问题描述:
我有两种类型的人员和组织都从IContact
继承。如何使用从不同方法返回的类型调用泛型方法?
我有一个返回基于某种逻辑,这些类型中的一种方法
private Type GetPersonOrOrganisation(string some variable)
{
either returns Person or Organisation type
}
我有查询的个人或机构]数据库的方法:
public static IQueryable<T> Query<T>(this IUow uow) where T : IContact
{
return uow.Query<T>();
}
我的问题是如何能我使用从GetPersonOrOrganisation
返回的类型来调用查询。
所以说:
var contactType = GetPersonOrOrganisation(string some variable);
var contact = Query<contactType>();
其中contactType将或者个人或组织。
很明显,这不会编译,这是我的问题。如何根据从GetPersonOrOrganisation
返回的内容从数据库中进行正确类型的查询。
答
你不能那样做。 但是,你试图完成什么?
请考虑使用ArrayList或List来代替。至于修改的查询将返回哪些类型,你可以调整这样的方法:
public static IQueryable<T> Query<T>(this IUow uow, Type returnType) where T : IContact
{
if(returnType is IContact) // code here
}
即快速代码可能有错误。
这个计算器的链接已经有关于这个讨论: using type returned by Type.GetType() in c#
答
Type
和仿制药之间的移动是一个重大的痛苦;没有重构的唯一答案是:反射;像这样:
var method = typeof(SomeType).GetMethod("Query").MakeGenericMethod(contactType);
// this is to getch your Query<T>(this IUow) method
var contact = (IContact)method.Invoke(null, new object[] { uow });
这是非常可怕的。如果可能的话,我建议您将Query<T>
方法改写为Query(Type type)
方法(返回IContact
),该方法仍然可以通过return (T) Query(typeof(T));
通过Query<T>
辅助方法获取现有代码。然而事实并非如此。
如果你传递一个类型T
的实例为的方法,也有一些技巧,你可以做simplfiy由此,利用dynamic
执行型/泛型/方法解析为您服务。
为什么没有IContact GetPersonOrOrganisation(字符串一些变量)的任何原因? – weismat 2013-03-13 07:46:52
是的,我需要该类型来调用查询,因为查询方法要求类型不是该类型的实际对象。 – user2005657 2013-03-13 07:52:27