【问题标题】:How to get MethodInfo of a generic method on a non generic .NET type? [duplicate]如何在非泛型 .NET 类型上获取泛型方法的 MethodInfo? [复制]
【发布时间】:2009-10-26 13:33:34
【问题描述】:

我有一个小问题,我无法弄清楚要传递给 Type.GetMethod 的参数以获取非泛型类型上泛型方法的 MethodInfo。 具体来说,我有这个类型定义:

public static class A
{
  public static B F<T>(bool dummy)
  {
  }
  public static B F<T>(IEnumerable<T> arg)
  {
  ...
  }
}

我在 Type.GetMethod 上尝试了几次,但没有一个会返回 F 方法的 MethodInfo。

我知道我可以调用 Type.GetMethods 甚至 Type.FindMember,但我对 Type.GetMethod 感兴趣。

有什么想法吗?

谢谢。

编辑

实际上,我的代码有点复杂。泛型方法被重载,所以我不能只使用函数名来使用 Type.GetMethod。 我尝试了这些变体:

typeof(A).GetMethod("F", BindingFlags.Static | BindingFlags.Public, null, new Type[]{ typeof(IEnumerable<>) }, null)
typeof(A).GetMethod("F`1", BindingFlags.Static | BindingFlags.Public, null, new Type[]{ typeof(IEnumerable<>) }, null)
typeof(A).GetMethod("F[T]", BindingFlags.Static | BindingFlags.Public, null, new Type[]{ typeof(IEnumerable<>) }, null)
typeof(A).GetMethod("F[[T]]", BindingFlags.Static | BindingFlags.Public, null, new Type[]{ typeof(IEnumerable<>) }, null)

【问题讨论】:

    标签: .net reflection methodinfo generic-method


    【解决方案1】:

    问题在于您传递给GetMethodIEnumerable&lt;&gt; 参数不是专用的。它确实是一个IEnumerable&lt;T&gt;,其中T 由您尝试检索的方法指定。但是,我们无法通过MethodInfo.GetGenericArguments() 获取T,因为我们没有对该方法的引用——我们仍在尝试检索它。

    不幸的是,这就是反射 API 的不足之处。没有Type.GetMethod() 重载可以让您区分重载方法,其中一个是泛型​​方法。

    话虽如此,您仍然无法使用Type.GetMethods() 并使用您选择的谓词过滤结果。要获取您感兴趣的方法,您可以执行以下操作。

    void getMethod()
    {
        typeof(A).GetMethods().Where(m =>
            m.IsGenericMethod &&
            m.GetParameters()[0].ParameterType.GetGenericTypeDefinition()
                == typeof(IEnumerable<>));
    }
    

    注意我还没有验证需要GetGenericTypeDefinition() 调用;你可以省略它。这个想法是您正在将类型 A&lt;T&gt; 转换为 A&lt;&gt;,但运行时可能已经以该形式将其提供给您。

    【讨论】:

      【解决方案2】:

      (根据问题说明进行了更新):

      没有办法使用GetMethod(例如,一行)获取方法的句柄,因为在我们有要检查的方法之前,定义方法的通用数据不可用。

      MethodInfo[] methods = typeof(A).GetMethods(BindingFlags.Static | BindingFlags.Public);
      MethodInfo genericMethod = methods.Where(m=>m.IsGenericMethod).First(m=>m.ContainsGenericParameters);
      genericMethod = genericMethod.GetGenericMethodDefinition();
      
      1. 获取方法
      2. 找到具有泛型参数的方法(假设您只有一个 - 如果添加多个,则需要更健壮一些)
      3. 获取通用方法信息

      【讨论】:

      • 谢谢,但我在这个问题上有点误导。我已将其更改为更准确。
      • 谢谢,但正如我在问题中提到的,我确实知道如何使用 GetMethods 或 FindMember。我对 GetMethod 特别感兴趣,因为它应该也能完成这项工作,但它没有,这让我很困扰。
      • @Mark 没有办法做到这一点,因为在我们有要检查的方法之前,定义方法的通用数据不可用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-16
      • 1970-01-01
      • 1970-01-01
      • 2015-07-30
      • 1970-01-01
      • 2013-04-17
      相关资源
      最近更新 更多