1

我有以下函数从字符串类型的控制器名称返回操作名称的选择列表:

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() 的参数控制器名称被传递为例如“AccountController”。但异常被抛出

MethodInfo[] mi = t.GetMethods();

作为:

Object reference not set to an instance of an object.
4

3 回答 3

5

"AccountController"不是完整的类型名称;它需要类似于"YourApp.Whatever.AccountController"forGetType()才能找到它。还值得明确说明它在哪个程序集中,例如:

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

(假设我们的意思是相同的程序集/命名空间)

于 2012-12-11T08:21:25.557 回答
1

显然Type.GetType返回null,因为它找不到指定名称的类AccountController。您应该使用命名空间指定全名。此外,如果您的控制器类不是来自执行程序集,则必须使用限定程序集名称(如

TopNamespace.SubNameSpace.AccountController, MyAssembly

)。

于 2012-12-11T08:19:01.920 回答
1

您应该将程序集限定名称指定为Type.GetType(controllername)

于 2012-12-11T08:22:57.963 回答