2

我有两种类型 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

4

2 回答 2

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为您执行类型/泛型/方法解析来简化这一点。

于 2013-03-13T07:51:56.213 回答
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#

于 2013-03-13T07:51:47.600 回答