【问题标题】:How to call a generic method using a type returned from a different method?如何使用从不同方法返回的类型调用泛型方法?
【发布时间】:2013-03-13 15:51:56
【问题描述】:

我有两种类型 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返回的内容从数据库中查询正确的类型。

【问题讨论】:

  • 有什么原因没有 IContact GetPersonOrOrganisation(string some variable)?
  • 是的,我需要调用查询的类型,因为查询方法需要类型不是该类型的实际对象。

标签: c#


【解决方案1】:

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&lt;T&gt; 方法重写为Query(Type type) 方法(返回IContact),它仍然可以通过return (T) Query(typeof(T)); 为现有代码提供一个通用的Query&lt;T&gt; 辅助方法。然而,情况并非如此。

如果您将T 类型的实例传入 方法,您可以采取一些技巧来简化此操作,使用dynamic 执行类型/泛型/方法解析给你。

【讨论】:

    【解决方案2】:

    你不能那样做。 但是,您实际上想要完成什么?

    考虑改用 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#

    【讨论】:

      猜你喜欢
      • 2023-03-12
      • 1970-01-01
      • 2016-12-24
      • 1970-01-01
      • 1970-01-01
      • 2021-02-14
      • 1970-01-01
      • 1970-01-01
      • 2012-04-21
      相关资源
      最近更新 更多