如何使用从其他方法返回的类型调用泛型方法

本文关键字:类型 调用 泛型方法 返回 方法 何使用 其他 | 更新日期: 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()返回的类型