Можно ли получить доступ к строке кода, где метод вызывается из этого метода? - PullRequest
0 голосов
/ 18 мая 2010

Отказ от ответственности:

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

Это сказало ... это возможно? Мне действительно просто интересно узнать.

Другими словами, если у меня есть что-то вроде этого:

int i = GetSomeInteger();

Есть ли какой-либо способ из в GetSomeInteger, чтобы код мог "знать" о том, что он вызывается в присваивании переменной i?

Опять же: нет никакого интереса делать это в каком-либо реальном сценарии. Просто любопытно!

Ответы [ 2 ]

2 голосов
/ 18 мая 2010

Это возможно с помощью System.Diagnostics.StackTrace.

Например, вы можете получить имя вызывающего метода следующим образом:

    private static void stackExample()
    {
        var stack = new System.Diagnostics.StackTrace(true); // pass true to get more stack info

        var callingMethod = stack.GetFrame(1).GetMethod().Name;
        var callingLine = stack.GetFrame(1).GetFileLineNumber();

        Console.WriteLine("callingMethod: " + callingMethod + " on line " + callingLine.ToString());
    }

http://msdn.microsoft.com/en-us/library/system.diagnostics.stacktrace.aspx

Это не даст вам строку кода вызывающего метода, для этого вам понадобится доступ к исходному коду. stack.GetFrame (1) .GetFileName () даст вам имя файла исходного кода, содержащего метод. Отсюда можно получить информацию о методе и номер строки, чтобы открыть исходный файл и получить соответствующую строку кода.

GetMethod () предоставляет вам все виды полезной информации, например, в каком модуле существует метод, и оттуда вы можете получить информацию о сборке.

На самом деле довольно интересно искать среди всех метаданных, он рассказывает вам все интересные вещи о вашем коде.

Причина, по которой вы не можете получить фактическую строку кода, заключается в том, что сам источник в форме C # не сохраняется в сборке. Хотя вы можете получить IL, его немного сложнее читать. :)

0 голосов
/ 18 мая 2010

Я не знаю конкретно, как можно получить к нему доступ, но теоретически, если код скомпилирован с символами отладки (например, в конфигурации отладки), тогда информация есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...