2009-10-26 116 views
6

我有这个小问题,我无法弄清楚哪些参数传递给Type.GetMethod以获取非泛型类型的泛型方法的MethodInfo。 具体来说,我有这种类型的定义:如何获取非泛型.NET类型的泛型方法的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) 
+0

请发布您尝试过的代码。 – 2009-10-26 13:36:23

+0

更改了我的问题。谢谢。 – mark 2009-10-26 13:48:12

+0

@Mark我改变了我的答案。 – 2009-10-26 14:13:56

回答

6

问题是您传递给GetMethodIEnumerable<>参数没有专门化。它确实是IEnumerable<T>,其中T由您试图检索的方法指定。但是,我们无法通过MethodInfo.GetGenericArguments()得到T,因为我们没有提及该方法 - 我们仍在尝试检索它。

不幸的是,这是反射API不足的地方。没有重载允许您区分重载的方法,其中一个是通用方法。

所以说,你坚持使用Type.GetMethods()和筛选结果与您选择的谓词。要获得您感兴趣的方法,您可以执行以下操作。

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

N.B.我还没有确认要求拨打GetGenericTypeDefinition();您可能可以省略它。这个想法是,你正在将一个A<T>类型转化为A<>,但运行时可能已经以这种形式给你。

5

(更新回应质疑澄清):

有没有办法得到一个手柄使用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. 获取generic methodinfo
+1

谢谢,但我在这个问题上略有误导。我已经改变它更准确。 – mark 2009-10-26 13:49:39

+0

谢谢,但正如我在我的问题中提到的,我知道如何使用GetMethods或FindMember来完成。我对GetMethod特别感兴趣,因为它也应该完成这项工作,但它并不那么困扰我。 – mark 2009-10-26 14:23:48

+0

@Mark没有办法做到这一点,因为定义方法的通用数据在我们有方法检查之前是不可用的。 – 2009-10-26 15:46:01

相关问题