2012-12-11 29 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 

)。

相关问题