如何使用从其他方法返回的类型调用泛型方法
本文关键字:类型 调用 泛型方法 返回 方法 何使用 其他 | 更新日期: 2023-09-27 18:03:34
我有两种类型,Person和organization都继承自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为Person或organization。
很明显这不会编译,这是我的问题。如何根据从GetPersonOrOrganisation
返回的内容从数据库中查询正确的类型。
在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
的实例传递给方法,您可以使用一些技巧来简化此操作,通过使用dynamic
为您执行类型/泛型/方法解析
你不能那样做。然而,你到底想要完成什么呢?
考虑使用ArrayList或List代替。作为在Query中返回哪种类型的修改,您可以这样调整方法:
public static IQueryable<T> Query<T>(this IUow uow, Type returnType) where T : IContact
{
if(returnType is IContact) // code here
}
这是一个快速代码,可能有错误。
这个stackoverflow链接已经对此进行了讨论:使用c#中type . gettype()返回的类型