我有以下函数从字符串类型的控制器名称返回操作名称的选择列表:
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);
}
get_all_action()的参数controllername被传递为例如“AccountController”。但是
引发了例外MethodInfo[] mi = t.GetMethods();
为:
Object reference not set to an instance of an object.
答案 0 :(得分:5)
"AccountController"
不是完整的类型名称;它需要像"YourApp.Whatever.AccountController"
GetType()
才能找到它。它也值得明确它所在的汇编,例如:
var thisType = GetType();
Type t = thisType.Assembly.GetType(
thisType.Namespace + "." + controllerName);
(假设我们的意思是相同的程序集/命名空间)
答案 1 :(得分:1)
显然Type.GetType
会返回null
,因为找不到指定名称AccountController
的类。您应该使用命名空间指定全名。此外,如果您的控制器类不是执行程序集,则必须使用合格的程序集名称(如
TopNamespace.SubNameSpace.AccountController, MyAssembly
)。
答案 2 :(得分:1)
您应指定assembly-qualified name至Type.GetType(controllername)