C # - Сложный сценарий «Найти использования» - PullRequest
0 голосов
/ 16 мая 2018

Предположим, у меня есть следующие классы в моем проекте:

  1. Базовый интерфейс

    public interface IInvoker
    {
        void Invoke();
    }
    
  2. Два класса, реализующие интерфейс

    Первый:

    public class Invoker1 : IInvoker
    {
        public void Invoke()
        {
            Console.WriteLine("Invoker #1");
        }
    }
    

    И второй:

    public class Invoker2 : IInvoker
    {
        public void Invoke()
        {
            Console.WriteLine("Invoker #2");
        }
    }
    
  3. Кроме того, у меня есть класс, который имеет поле типа интерфейса:

    public class InvokerContainer
    {
        private readonly IInvoker target;
    
        public InvokerContainer(IInvoker invoker)
        {
            this.target = invoker;
        }
    
        public void InvokeTarget()
        {
            this.target.Invoke();
        }
    }
    

Код клиента выглядит следующим образом:

class Program
{
    static void Main(string[] args)
    {
        InvokingMethod1(new Invoker1());
        InvokingMethod2(new Invoker2());
        new InvokerContainer(new Invoker1()).InvokeTarget();
        Console.ReadKey();
    }

    private static void InvokingMethod1(IInvoker invoker)
    {
        invoker.Invoke();
    }

    private static void InvokingMethod2(IInvoker invoker)
    {
        invoker.Invoke();
    }
}

Итак, мой вопрос: есть ли способ найти все места, где используется Invoker1#Invoke, и какова возможная иерархия вызовов? С кодом выше, этот подход должен дать следующие результаты:

  1. Метод вызова: Program#InvokingMethod1. Трассировка стека: Program#Main -> Program#InvokingMethod1 строка 17
  2. Метод вызова: InvokerContainer#InvokeTarget. Трассировка стека: Program#Main -> InvokerContainer#InvokeTarget строка 14
...