2017-02-09 10 views
0

Я пытаюсь получить список всех общедоступных методов, которые возвращают ActionResult из любого контроллера в моем решении с использованием отражения, но я испытываю странное поведение.Итерация над контроллерами в решении

Assembly asm = Assembly.GetAssembly(typeof(MyDLL.MvcApplication)); 

var controllerActionList = asm.GetTypes().ToList(); 

Если я запускаю приведенный выше код я получаю список всех моих типов, включая все мои модели и контроллеры и т.д. так же, как я бы ожидать. Однако, если я изменю его и запустил код ниже, мой список результатов вернется пустым. Любая идея, что здесь происходит? Я бы подумал, что это должно фильтровать типы вниз, поэтому я получаю список всех контроллеров правильно?

Assembly asm = Assembly.GetAssembly(typeof(MyDLL.MvcApplication)); 

var controllerActionList = asm.GetTypes() 
    .Where(type => typeof(Controller).IsAssignableFrom(type)).ToList(); 
+0

Ваш код действительно должен работать. Вместо typeof (Controller) вы можете попробовать typeof (System.Web.Mvc.Controller)? Затем следует сообщать о любых подклассах System.Web.Mvc.Controller. –

+0

Ya Я уже пробовал, и это не сработало, но я понял, что это работает странным образом. Я думаю, что версия .net, которую использует этот проект, не совсем то же самое, что и используемая целевая DLL, и это приводит к тому, что сравнение типов всегда терпит неудачу. Проверьте мой ответ ниже, как я получил его, делая то, что хочу. Спасибо за помощь! –

ответ

0

Я получил его, используя приведенный ниже код. Я думаю, что сравнение прямого типа не подходит для меня, потому что я считаю, что у меня есть две разные версии .net между этими двумя проектами.

Assembly asm = Assembly.GetAssembly(typeof(SCCView.MvcApplication)); 

var controllerActionList = asm.GetTypes() 
    .Where(type => type.BaseType.Name == "Controller") 
    .SelectMany(type => type.GetMethods()) 
    .Where(
     m => m.IsPublic && m.ReturnType.Name == "ActionResult") 
    .Select(x => new {Controller = x.DeclaringType.Name, Action = x.Name}) 
    .OrderBy(x => x.Controller).ThenBy(x => x.Action).ToList(); 

выше даст вам парный список всех общедоступный метод в контроллере, который возвращает ActionResult