2009-10-26 97 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

相關問題