动态返回控制器的所有动作

时间:2012-12-09 12:09:47

标签: c# asp.net-mvc-3

我找到了以下代码来从控制器名称获取所有操作。

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.

1 个答案:

答案 0 :(得分:2)

您的get_all_action方法期望接收Type作为输入参数,而您尝试使用String(即Type name)作为输入参数来调用它。

这一行:

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();