Предположим, у меня есть следующие классы в моем проекте:
Базовый интерфейс
public interface IInvoker
{
void Invoke();
}
Два класса, реализующие интерфейс
Первый:
public class Invoker1 : IInvoker
{
public void Invoke()
{
Console.WriteLine("Invoker #1");
}
}
И второй:
public class Invoker2 : IInvoker
{
public void Invoke()
{
Console.WriteLine("Invoker #2");
}
}
Кроме того, у меня есть класс, который имеет поле типа интерфейса:
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
, и какова возможная иерархия вызовов?
С кодом выше, этот подход должен дать следующие результаты:
- Метод вызова:
Program#InvokingMethod1
. Трассировка стека: Program#Main
-> Program#InvokingMethod1
строка 17
- Метод вызова:
InvokerContainer#InvokeTarget
. Трассировка стека: Program#Main
-> InvokerContainer#InvokeTarget
строка 14