Как найти все вхождения пользовательского атрибута в сборках?

Как я могу найти каждое вхождение пользовательского атрибута внутри сборки?

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

Есть ли какой-либо ярлык для этого или единственный способ сделать это, чтобы написать код для поиска всех частей типа (свойства, поля, методы и т. д.)?

Reflector делает это, но не уверен, как это реализовано.


person Marcus    schedule 18.08.2010    source источник


Ответы (2)


Do,

assembly.GetTypes()
    .SelectMany(type => type.GetMembers())
    .Union(assembly.GetTypes())
    .Where(type => Attribute.IsDefined(type, attributeType));

Это также вернет значения enum, так как это просто общедоступные статические поля под капотом. Кроме того, если вам нужны частные участники, вам придется настроить BindingFlags, который вы передаете.

person Kirk Woll    schedule 18.08.2010

Вы можете использовать Type.GetMembers(), чтобы получить всех , методы, поля и т. д.), а не делать каждый тип члена отдельно. По крайней мере, это должно сделать его несколько проще.

Обратите внимание, что вы можете захотеть передать различные флаги привязки (экземпляр, статический, общедоступный, непубличный), чтобы убедиться, что вы поймали все.

person Jon Skeet    schedule 18.08.2010
comment
Я тоже получаю Enum-значения? Не само перечисление, а значения? - person Marcus; 18.08.2010
comment
@Marcus, перечисления — это типы, поэтому вам нужно сначала получить все типы в сборке с помощью метода GetTypes, а затем применить метод GetMembers к каждому типу. Вам понадобятся два вложенных цикла. - person Darin Dimitrov; 18.08.2010
comment
@Marcus: GetMembers() вернет поля, а значения типов перечисления являются полями. - person Jon Skeet; 18.08.2010
comment
@Дарин, да, я понимаю, поэтому мне нужно вручную проверить, является ли текущий член перечислением, а затем запросить его значения перечисления, чтобы также проверить их на наличие атрибутов? - person Marcus; 18.08.2010
comment
@Маркус, нет, тебе не нужно проверять, является ли это перечислением. Вы не должны заботиться об этом. Как сказал @Jon, если текущий тип является перечислением, метод GetMembers() вернет вам поля этого перечисления, чтобы вы могли проверить, украшены ли они вашим настраиваемым атрибутом. - person Darin Dimitrov; 18.08.2010