2012-12-11 27 views
1

我有以下函數從字符串類型的控制器名稱返回動作名稱的選擇列表的列表:get_all_action的獲取來自控制器的名稱的方法是在字符串格式

public ActionResult get_all_action(string controllername) 
     { 
      Type t = Type.GetType(controllername); 
      MethodInfo[] mi = t.GetMethods(); 

      List<SelectListItem> action = new List<SelectListItem>(); 

      foreach (MethodInfo m in mi) 
      { 
       if (m.IsPublic) 
        if (typeof(ActionResult).IsAssignableFrom(m.ReturnParameter.ParameterType)) 
        { 
         action.Add(new SelectListItem() { Value = m.Name, Text = m.Name }); 
        } 
      } 

      var List = new SelectList(action, "Value", "Text"); 

      return Json(List, JsonRequestBehavior.AllowGet); 
     } 

參數controllername()傳遞例如「AccountController」。但例外是在

MethodInfo[] mi = t.GetMethods(); 

拋出:

Object reference not set to an instance of an object. 

回答

5

"AccountController"不是完整的類型名稱;它需要像"YourApp.Whatever.AccountController"這樣的GetType()才能找到它。這也是值得擺明是在裝配,例如:

var thisType = GetType(); 
Type t = thisType.Assembly.GetType(
    thisType.Namespace + "." + controllerName); 

(假定我們指的是相同的組件/命名空間)

1

顯然Type.GetType回報null,因爲它找不到類指定名稱AccountController。您應該使用名稱空間指定全名。另外,如果您的控制器類沒有執行裝配,則必須使用合格的裝配名稱(如

TopNamespace.SubNameSpace.AccountController, MyAssembly 

)。

相關問題