Это даст вам словарь с типом контроллера в качестве ключа и IEnumerable его MethodInfos в качестве значения.
var assemblies = AppDomain.CurrentDomain.GetAssemblies(); // currently loaded assemblies
var controllerTypes = assemblies
.SelectMany(a => a.GetTypes())
.Where(t => t != null
&& t.IsPublic // public controllers only
&& t.Name.EndsWith("Controller", StringComparison.OrdinalIgnoreCase) // enfore naming convention
&& !t.IsAbstract // no abstract controllers
&& typeof(IController).IsAssignableFrom(t)); // should implement IController (happens automatically when you extend Controller)
var controllerMethods = controllerTypes.ToDictionary(
controllerType => controllerType,
controllerType => controllerType.GetMethods(BindingFlags.Public | BindingFlags.Instance).Where(m => typeof(ActionResult).IsAssignableFrom(m.ReturnType)));
Он смотрит больше, чем просто текущая сборка, и также возвращает методы, которые,например, вернуть JsonResult вместо ActionResult.(JsonResult на самом деле наследует от ActionResult)
Редактировать: Для поддержки Web API
Изменить
&& typeof(IController).IsAssignableFrom(t)); // should implement IController (happens automatically when you extend Controller)
на
&& typeof(IHttpController).IsAssignableFrom(t)); // should implement IHttpController (happens automatically when you extend ApiController)
и удалить это:
.Where(m => typeof(ActionResult).IsAssignableFrom(m.ReturnType))
Потому что методы Web API могут возвращать практически все.(POCO, HttpResponseMessage, ...)