Использование LINQ и Reflection: Как сделать запрос для всех классов с атрибутом [Authorize] в моей сборке? - PullRequest
1 голос
/ 10 июня 2010

В настоящее время я пытаюсь определить, какие классы «Controller» в моей сборке имеют атрибут [Authorize], связанный с ними, с помощью Reflection и LINQ.

const bool allInherited = true;
var myAssembly = System.Reflection.Assembly.GetExecutingAssembly();
var controllerList = from type in myAssembly.GetTypes()
                     where type.Name.Contains("Controller")
                     where !type.IsAbstract
                     let attribs = type.GetCustomAttributes(allInherited)
                     where attribs.Contains("Authorize")
                     select type;
controllerList.ToList();

Этот код почти работает.

Если я пошагово прослеживаю оператор LINQ, я вижу, что при "наведении мыши" переменная диапазона attribs, которую я определяю в операторе LINQ, заполняется одним атрибутом, и этот атрибут оказывается типа AuthorizeAttribute. Это выглядит примерно так:

[-] attribs | {object[1]}
   [+]  [0] | {System.Web.Mvc.AuthorizeAttribute}

Очевидно, что эта строка в моем утверждении LINQ неверна:

where attribs.Contains("Authorize")

Что мне вместо этого написать, чтобы определить, содержит ли attribs тип AuthorizeAttribute или нет?

Ответы [ 2 ]

3 голосов
/ 10 июня 2010

вы бы хотели сделать

attribs.Any(a => a.GetType().Equals(typeof(AuthorizeAttribute))

вы сравнивали объект со строкой, поэтому проверка всегда была неудачной, это должно сработать.

0 голосов
/ 22 ноября 2013

Я думаю, что лучший способ сделать это:

var controllerList = (from type in Assembly.GetExecutingAssembly().GetTypes()
                      where !type.IsAbstract
                      where type.IsSubclassOf(typeof(Controller)) || type.IsSubclassOf(typeof(System.Web.Http.ApiController))
                      where type.IsDefined(typeof(AuthorizeAttribute), allInherited)
                      select type).ToList();

Или, если вы ищете какой-либо атрибут с надписью "Авторизоваться":

var controllerList = from type in myAssembly.GetTypes()
                     where type.Name.Contains("Controller")
                     where !type.IsAbstract
                     let attrs = type.GetCustomAttributes(allInherited).OfType<Attribute>()
                     where attrs.Any(a => a.Name.Contains("Authorize"))
                     select type;
...