0

我发现以下代码可以从控制器名称中获取所有操作。

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.
4

1 回答 1

2

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

这里的行:

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();
于 2012-12-09T12:13:24.727 回答