2009-09-21 47 views
2

我的目的是調查?‘使用反射型的方法’,以驗證以下事項:C# - 調查「方法」信息使用反射

  1. 的方法應該是實例方法和公衆。

  2. 注意到自然界中的參數 「PARAMS」 和無效的。

  3. 該方法不會使遞歸調用。

我開始爲:

static void ProcessMethodInfo(Type t) 
    { 
     MethodInfo[] info = t.GetMethods(); 

     foreach (MethodInfo mi in info) 
     { 

      // How to check the conditions here ? 

     } 
    } 

但我不知道該如何繼續進行。需要幫助。

+0

我認爲第3項將非常難以正確測試。爲了您的目的,如果一個方法與另一個方法相互遞歸(即調用b的調用b的方法)是否遞歸? – jason

+0

Thanks.I測試方法遞歸本身不是相互one.for例如斐波那契系列。 – user160677

+0

@csharpbaby:即使這樣做會非常困難,而且不能通過反思來實現。 – jason

回答

3

那麼,如果是3,你的意思是檢查方法應該是非遞歸的;那麼這是一個痛苦 - 你需要解析IL。但對於其他人;

Type type = ... 
    var qry = from method in type.GetMethods(
        BindingFlags.Instance | BindingFlags.Public) 
       where method.ReturnType == typeof(void) 
       let parameters = method.GetParameters() 
       where parameters.Length == 1 
       && parameters[0].ParameterType.IsArray 
       && Attribute.IsDefined(parameters[0], typeof(ParamArrayAttribute)) 
       select method; 
    foreach (var method in qry) 
    { 
     Console.WriteLine(method.Name); 
    } 
+2

我認爲應該避免使用==來比較類的實例。等於可能會被覆蓋,但==通常不會超載。 – Joren

+1

你的意思是'Type'?這是完全有效的。我知道你在說什麼,但代碼很好。 –

+0

非常棒Marc.非常感謝。 – user160677

0

我不認爲你可以使用反射來檢測項目3。

0

檢查的MethodInfo類的成員如下:

  • IsPublic
  • IsStatic
  • 返回類型
  • GetParameters()方法

爲了能夠檢查方法是否是遞歸的,我想你會需要更多的東西,然後只是簡單的思考。