#c# #.net #reflection
#c# #.net #отражение
Вопрос:
Можно ли извлечь из данного метода какую-либо информацию о методе, который его вызвал?
public void MethodOne()
{
for (int nCount = 0; nCount < 10; nCount ) MethodTwo();
}
public void MethodTwo()
{
// Can I retrieve here information about the call to MethodOne which originated this call?
}
Например, в этой ситуации я хотел бы иметь возможность знать во время выполнения, что заданный набор из десяти вызовов to MethodTwo
был создан из вызова to MethodOne
в данном потоке… Возможно ли это?
Комментарии:
1. Вы хотите считать только прямые вызовы? Что, если Метод1 вызывает Foo, затем Foo вызывает Bar, а Bar вызывает methodTwo ?
2. Возможно, вам это не понравится, но вызов
Method2("MethodOne")
(или какой-либо другой способ выражения источника), возможно, является здесь разумным механизмом…
Ответ №1:
Это ужасно:
string caller0 = new StackFrame(1).GetMethod().Name; // MethodOne
string caller1 = new StackFrame(2).GetMethod().Name; // whatever called MethodOne
(это также не предоставляется бесплатно; любое такое злоупотребление имеет цену производительности)
Комментарии:
1. Также стоит отметить, что в дополнение к снижению производительности это также потенциально ненадежно: дрожание может решить встроить любой из этих методов.
2. Однако не для вызова делегата.
Ответ №2:
Нелегко, хотя это возможно, если вы изучите текущую трассировку стека:
using System.Diagnostics;
// ...
StackTrace t = new StackTrace();
Если вам нужно, чтобы ваш код вел себя по-разному в зависимости от того, кто является вызывающим, у вас должен быть дополнительный параметр для вашего метода, который вызывающий может использовать для идентификации себя.
Если вы используете эту информацию для отладки своего приложения, то вместо этого вы можете захотеть использовать профилировщик, который может сообщить вам такую информацию без необходимости изменять свой код.