如何通过传递ControllerName获取MVC Controller的所有操作列表?

时间:2012-07-02 19:58:20

标签: asp.net-mvc controller action

如何获取Controller的所有操作列表?我搜索但找不到示例/答案。我看到一些推荐使用反射的例子,但我不知道如何。

以下是我要做的事情:

public List<string> ActionNames(string controllerName){




}

2 个答案:

答案 0 :(得分:22)

你还没有告诉我们你为什么需要这个,但有一种可能性就是使用反思:

public List<string> ActionNames(string controllerName)
{
    var types =
        from a in AppDomain.CurrentDomain.GetAssemblies()
        from t in a.GetTypes()
        where typeof(IController).IsAssignableFrom(t) &&
                string.Equals(controllerName + "Controller", t.Name, StringComparison.OrdinalIgnoreCase)
        select t;

    var controllerType = types.FirstOrDefault();

    if (controllerType == null)
    {
        return Enumerable.Empty<string>().ToList();
    }
    return new ReflectedControllerDescriptor(controllerType)
        .GetCanonicalActions().Select(x => x.ActionName)
        .ToList();
}

显然我们知道反射速度不是很快,所以如果你打算经常调用这个方法,你可以考虑通过缓存控制器列表来改进它,以避免每次都取出它,甚至memoizing给定输入参数的方法

答案 1 :(得分:0)

对达林的答案稍作调整。我需要这个更改才能使用代码lense,因为它在不同的程序集下运行。

public static List<string> GetAllActionNames(string controllerName)
{
    var controllerType = Assembly.Load("YourAssemblyNameHere")
        .GetTypes()
        .FirstOrDefault(x => typeof(IController).IsAssignableFrom(x) 
            && x.Name.Equals(controllerName + "Controller", StringComparison.OrdinalIgnoreCase));

    if (controllerType == null)
    {
        return Enumerable.Empty<string>().ToList();
    }
    return new ReflectedControllerDescriptor(controllerType)
        .GetCanonicalActions().Select(x => x.ActionName)
        .ToList();
}