如何使用从不同方法返回的类型调用泛型方法?

时间:2013-03-13 07:41:39

标签: c#

我有两种类型的人和组织都继承自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返回的内容从数据库中对正确的类型进行查询。

2 个答案:

答案 0 :(得分:2)

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),这仍然可以通过简单的方式为现有代码提供通用的Query<T>辅助方法, return (T) Query(typeof(T));。但事实并非如此。

如果您将类型为T 的实例传递给方法,则可以通过使用dynamic执行类型/来简化此操作。为您提供泛型/方法解析。

答案 1 :(得分:0)

你做不到。 但是,你想要实现的目标是什么?

请考虑使用ArrayList或List。作为在Query中返回哪种类型的修改,你可以调整这样的方法:

public static IQueryable<T> Query<T>(this IUow uow, Type returnType) where T : IContact
{
  if(returnType is IContact) // code here
}

这是可能有错误的快速代码。

此stackoverflow链接已经讨论过: using type returned by Type.GetType() in c#