Найти все варианты использования метода (в том числе через интерфейс) с использованием 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.
Другие вопросы по тегам