Getting All Controllers and Actions names in C#

前端 未结 9 1636
耶瑟儿~
耶瑟儿~ 2020-11-27 10:56

Is it possible to list the names of all controllers and their actions programmatically?

I want to implement database driven security for each controller and action.

相关标签:
9条回答
  • 2020-11-27 11:44

    The following will extract controllers, actions, attributes and return types:

    Assembly asm = Assembly.GetAssembly(typeof(MyWebDll.MvcApplication));
    
    var controlleractionlist = asm.GetTypes()
            .Where(type=> typeof(System.Web.Mvc.Controller).IsAssignableFrom(type))
            .SelectMany(type => type.GetMethods(BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.Public))
            .Where(m => !m.GetCustomAttributes(typeof( System.Runtime.CompilerServices.CompilerGeneratedAttribute), true).Any())
            .Select(x => new {Controller = x.DeclaringType.Name, Action = x.Name, ReturnType = x.ReturnType.Name, Attributes = String.Join(",", x.GetCustomAttributes().Select(a => a.GetType().Name.Replace("Attribute",""))) })
            .OrderBy(x=>x.Controller).ThenBy(x => x.Action).ToList();
    

    If you run this code in linqpad for instance and call

    controlleractionlist.Dump();
    

    you get the following output:

    enter image description here

    0 讨论(0)
  • 2020-11-27 11:48

    You can use reflection to find all Controllers in the current assembly, and then find their public methods that are not decorated with the NonAction attribute.

    Assembly asm = Assembly.GetExecutingAssembly();
    
    asm.GetTypes()
        .Where(type=> typeof(Controller).IsAssignableFrom(type)) //filter controllers
        .SelectMany(type => type.GetMethods())
        .Where(method => method.IsPublic && ! method.IsDefined(typeof(NonActionAttribute)));
    
    0 讨论(0)
  • 2020-11-27 11:53
    Assembly assembly = Assembly.LoadFrom(sAssemblyFileName)
    IEnumerable<Type> types = assembly.GetTypes().Where(type => typeof(Controller).IsAssignableFrom(type)).OrderBy(x => x.Name);
    foreach (Type cls in types)
    {
          list.Add(cls.Name.Replace("Controller", ""));
          IEnumerable<MemberInfo> memberInfo = cls.GetMethods(BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.Public).Where(m => !m.GetCustomAttributes(typeof(System.Runtime.CompilerServices.CompilerGeneratedAttribute), true).Any()).OrderBy(x => x.Name);
          foreach (MemberInfo method in memberInfo)
          {
               if (method.ReflectedType.IsPublic && !method.IsDefined(typeof(NonActionAttribute)))
               {
                      list.Add("\t" + method.Name.ToString());
               }
          }
    }
    
    0 讨论(0)
提交回复
热议问题