2010-07-05 5 views
2

У меня есть 3 метода A(), B() и C(), оба вызова A() и B() C(). В методе C(), как я могу узнать его вызов из A() или B()?Как я могу узнать, какой метод вызывает мой метод?

+0

Почему бы вам не задать код, чтобы узнать, какой метод его вызывает? –

+0

Метод C() использует имя метода метода, а именно A и B как параметр отражения для вызова удаленной службы, имя метода на клиенте всегда совпадает с именем метода на сервере, тогда, если я могу это сделать, это помогает нашей команде уменьшить количество ключей. – Anonymous

+0

Сокращение ключевых штрихов - очень (очень) плохая мотивация для создания такого беспорядка обслуживания. –

ответ

7

Я не рекомендую этот подход - другие плакаты указывают на лучшие способы обращения с этим. Но если вы действительно, действительно нужно знать, кто звонил вам, не меняя C() «S параметры, вы можете сделать это:

static void A() 
{ 
    C(); 
} 

static void C() 
{ 
    StackTrace st = new StackTrace(); 
    Console.WriteLine(st.GetFrame(1).GetMethod().Name); // prints "A" 
} 

Обратите внимание, что генерируя StackTrace несколько дороже. Однако неважно, если вы не делаете это в коде, который вы вызываете очень часто.

Опять же, вы почти наверняка найдете лучший способ сделать все, что вы пытаетесь сделать.

11

Вам не нужно. Некоторый метод должен выполнять определенную задачу, на которую влияют ее параметры и атрибуты объекта, а не вызывающий.

1

Простой (и чистый) способом было бы ввести новый параметр для C и пусть A и B сказать C, который назвал его.

3

Метод C() не должен нужен, чтобы узнать, какой метод его назвал. Если это так, как вы обрабатываете логику потока, вам нужно снова подумать о том, как вы пишете свой код. Если мы предположим, что существует некоторая обоснованная причина необходимости знать, какой метод называется C(), я бы создал два метода «обертки»: C_From_A() и C_From_B(). Любая логика специфична для методов вызова должна быть перенесена на новые методы, в то время как общий код остается в методе C() и вызывается из двух новых методов:

public void C() 
{ 
    // Common Code goes here 
} 

public void C_From_A() 
{ 
    // Code only to be called from A() goes here. 

    C(); // Common code executed 
} 

public void C_From_B() 
{ 
    // Code only to be called from B() goes here. 

    C(); // Common code executed 
} 


public void A() 
{ 
    // Other code goes here 

    C_From_A(); 
} 

Если вам нужно знать для отладки, просто используйте отладчик, чтобы выполнить свой код.

0

Просто установите контрольную точку в C()

0

Я согласен в принципе, вы не должны знать, в большинстве ситуаций.

Однако один случай использования, когда это может быть полезно знать, является отладкой, в которой была получена определенная информация. В случае неудачного переданного параметра.

Однако в этом случае, вероятно, лучше бросить исключение, зарегистрировать исключение и «восстановить» из него. Очевидно, это зависит от того, как часто вызывается метод, поскольку при создании исключения всегда возникают некоторые накладные расходы. Если вам нужно сделать это по какой-то другой причине, я бы предложил вам сначала взглянуть на ваш дизайн.

Если вам нужны обратные вызовы, я бы предположил, что вы делаете A и B, оба реализуете интерфейс и передаете A или B в качестве параметра. Интерфейс может иметь метод, называемый обратным вызовом, а C может вызвать A или B.

0

В случае, когда вы пытаетесь выяснить, где был передан «плохой параметр», вам нужно только установить условную точку останова в этом методе или попробуйте перерыв VS на исключение, которое будет выбрано, а затем вы можете проверить стек вызовов (Debug Menu, Window, Stack), чтобы увидеть всю цепочку вызывающих (с переданными аргументами) этому методу.

0
MethodInfo callerMethod = new System.Diagnostics.StackFrame(1).GetMethod(); 

Полезно, если вы пишете структуру аудита/журнала, но на самом деле здесь применяется YDNTN. Плюс это стоит целое состояние во время выполнения.

Смежные вопросы