2012-12-09 53 views
0

我發現了以下代碼來從控制器名稱中獲取所有動作。使動態返回控制器的所有動作

Type t = typeof(YourControllerType); 
MethodInfo[] mi = t.GetMethods(); 
foreach (MethodInfo m in mi) 
{ 
    if (m.IsPublic) 
     if (typeof(ActionResult).IsAssignableFrom(m.ReturnParameter.ParameterType)) 
      methods = m.Name + Environment.NewLine + methods; 
} 

我想通過傳遞控制器的名稱,以便下面的代碼動態的功能如下:

public string get_all_action(type ob) 
     { 
      string methods = ""; 
      Type t = typeof(ob); 
      MethodInfo[] mi = t.GetMethods(); 

      foreach (MethodInfo m in mi) 
      { 
       if (m.IsPublic) 
        if (typeof(ActionResult).IsAssignableFrom(m.ReturnParameter.ParameterType)) 
         methods = m.Name + Environment.NewLine + methods; 
      } 

      return methods; 
     } 

但我搞不清應該通過什麼類型的參數對函數的定義,並同時調用該函數。 我有以下代碼獲取所有控制器並將控制器名稱傳遞給get_all_action()。

var asm = Assembly.GetExecutingAssembly(); 
      var controllerTypes = from d in asm.GetExportedTypes() where typeof(IController).IsAssignableFrom(d) select d; 
      foreach(var val in controllerTypes) 
      {     
       string actionname = get_all_action(val.Name); 


      } 

這裏,val.Name是字符串類型因此拋出異常:

Object reference not set to an instance of an object. 

回答

2

get_all_action方法需要接受一個類型作爲輸入參數,而你試圖把它與一個字符串(即類型名稱)作爲輸入參數。

在這裏行:

string actionname = get_all_action(val.Name); 

應改爲:

string actionname = get_all_action(val); 

和你get_all_action方法的前幾行應改爲:

public string get_all_action(Type controllerType) 
{ 
    string methods = ""; 
    MethodInfo[] mi = controllerType.GetMethods(); 
+1

我認爲這是足夠'get_all_action(val)'。 –

+0

@Mario,謝謝 - 我的代碼過於防守了! (編輯更新) –

+0

我認爲這將工作優秀=)很好的更新! –

相關問題