2009-01-11 73 views
3

考慮這樣一個有沒有一種獲得開放泛型方法的MethodInfo的好方法?

public interface IHaveGenericMethod 
{ 
    T1 Method<T1>(T1 parm); 
    T2 Method<T1,T2>(T1 parm); 
    int Method2(int parm); 
} 

型我如何獲得一個MethodInfo的爲它的方法? 對常規的非泛型方法,如方法2,我可以

typeof(IHaveGenericMethod).GetMethod("methodName",new Type[]{typeof(itsParameters)}); 

去一個通用的方法,雖然,我不能,因爲它的參數是不是每本身的類型。 那麼,我該怎麼做? 我知道我可以調用

typeof(IHaveGenericMethod).GetMethods() 

獲得該類型的所有方法,然後遍歷該集合,並做一些匹配,但它的醜陋。有沒有更好的辦法?

+0

重 「但並沒有回答我的問題:」 也許,但見 - 即AFAIK你不可能真的比這更清潔。 – 2009-01-11 22:28:28

+0

[如何獲得泛型方法的MethodInfo?](http://stackoverflow.com/questions/326136/how-to-get-methodinfo-of-a-generic-method) – nawfal 2013-10-08 10:15:57

回答

1

那麼,他們類型 - 各種各樣的:

foreach (var method in typeof(IHaveGenericMethod).GetMethods()) 
    { 
     Console.WriteLine(method.Name); 
     if (method.IsGenericMethodDefinition) 
     { 
      foreach (Type type in method.GetGenericArguments()) 
      { 
       Console.WriteLine("> " + type.Name); 
      } 
     } 
    } 

所以,你可以通過args來號檢查,並檢查簽名。但沒有更乾淨的。

+0

好吧,是的,但是那不回答我的問題 – 2009-01-11 22:08:31

2

請務必查看MSDN頁面「Reflection and Generic Types」。

,因爲它的參數是不是類型的每本身

其實,我覺得那是因爲你要查詢參數,但可以提供GetMethod()類型列表中不是類型參數。另外,請記住,所有需要選擇通用方法的「方法組」都是要知道泛型類型參數的數量。所以你可以數它們。

然後遍歷

不要迭代,查詢: - 「但沒有什麼清潔劑」

 var mi = from mi in typeof(IHaveGenericMethod).GetMethods() 
       where mi.Name == "Method" 
       where mi.IsGenericMethodDefinition 
       where mi.GetGenericArguments().Length == 2 
       select mi; 
相關問題