Найти все варианты использования метода (в том числе через интерфейс) с использованием NDepend
Используя NDepend, как я могу найти все, прямые и косвенные, использования определенного метода или свойства?
В частности, мне нужно найти использования, которые происходят через интерфейс где-то вдоль пути использования. Спасибо!
1 ответ
Решение
Если щелкнуть правой кнопкой мыши метод в любом месте пользовательского интерфейса и выбрать меню: выберите метод... > ... который использует меня (прямо или косвенно), вы получите запрос кода:
from m in Methods
let depth0 = m.DepthOfIsUsing("NUnit.Core.NUnitFramework+Assert.GetAssertCount()")
where depth0 >= 0 orderby depth0
select new { m, depth0 }
Проблема в том, что такой запрос дает косвенное использование, но не ищет вызовы, которые происходят через интерфейс (или переопределенный метод, объявленный в базовом классе).
Надеюсь, то, что вы просите, можно получить с помощью этого запроса:
// Retrieve the target method by name
let methodTarget = Methods.WithFullName("NUnit.Core.NUnitFramework+Assert.GetAssertCount()").Single()
// Build a ICodeMetric<IMethod,ushort> representing the depth of indirect
// call of the target method.
let indirectCallDepth =
methodTarget.ToEnumerable()
.FillIterative(
methods => methods.SelectMany(
m => m.MethodsCallingMe.Union(m.OverriddensBase)))
from m in indirectCallDepth.DefinitionDomain
select new { m, callDepth = indirectCallDepth[m] }
Два краеугольных камня этого запроса:
- Вызов FillIterative() для рекурсивного выбора косвенного вызова.
- Вызов свойства IMethod.OverriddensBase, как следует из его названия. Для метода M это возвращает перечислимый из всех методов, объявленных в базовом классе или интерфейсе, переопределенных M.