NDepend: возможно ли перечисление атрибутов, прикрепленных к методу?
Я пытаюсь использовать NDepend и его язык запросов на основе Linq для генерации некоторых отчетов о текущем состоянии кода. Я хочу пометить некоторые из моих методов и классов предопределенными "тегами", например, методы, помеченные тегом "База данных", содержат специальный код базы данных, а те, которые помечены тегом "Алгоритм_X", содержат специальную логику, связанную с алгоритмом "X". Мы считаем, что такая процедура тегирования приведет к более простому процессу создания документации.
Интересно, предоставляет ли NDepend механизм, который облегчает такой процесс? Я имею в виду использование атрибутов C# для генерации таких пользовательских тегов, а затем маркирование методов соответствующими атрибутами, которые соответствуют их тегированию. Я хорошо знаю метод ".HasAttribute" в CQLinq и активно его использую. Но для этой процедуры тегирования нужен способ перечисления или перечисления всех атрибутов, прикрепленных к методу, и я до сих пор не смог реализовать его с помощью NDepend.
Мой вопрос Есть ли способ реализовать это (перечисление всех атрибутов метода) в NDepend? Если нет, есть ли другой способ в NDepend, который бы облегчил такую процедуру тегирования? Я могу реализовать это с помощью Reflections, написав собственный код C#, но я хочу быть уверен, что у меня нет вариантов с NDepend в этом состоянии.
1 ответ
На самом деле вы можете перечислить атрибуты, помечающие метод с помощью запроса кода NDepend LINQ (CQLINQ), но это не просто и не быстро. Мы планируем улучшить поддержку атрибутов в модели кода NDepend, это было задано в пользовательском голосе NDepend.
Таким образом, следующий запрос работает, но он может занять несколько секунд на большой базе кода (что является медленным для NDepend, где обычно запросы выполняются за несколько миллисекунд):
let typesAttributes = Types.Where(t => t.IsAttributeClass)
from m in Methods
let mAttributes = typesAttributes.Where(t => m.HasAttribute(t)).ToArray()
where mAttributes .Length > 0
select new { m, mAttributes }
Оптимизация, приведенная ниже, заставит его работать в два раза быстрее.
let typesAttributes = Types.Where(t => t.IsAttributeClass)
from m in Types.UsingAny(typesAttributes).ChildMethods()
let mAttributes = typesAttributes.Where(t => m.HasAttribute(t)).ToArray()
where mAttributes .Length > 0
select new { m, mAttributes }