2010-05-18 2 views
0

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

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

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

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

int i = GetSomeInteger(); 

Есть ли способ из вGetSomeInteger, что код может быть «в курсе» о том, что она вызывается в присвоении переменная i?

Снова: не заинтересован в этом в каком-либо реальном сценарии. Просто любопытно!

+1

В Java вы можете использовать 'Thread.currentThread(). GetStackTrace()', который по крайней мере даст вам номер строки. Хотя я мало что знаю о .NET, я предполагаю, что должно быть что-то подобное. – Syntactic

ответ

2

Возможно использование системы.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

Это начало, но он, кажется, хочет, чтобы он был до фактической линии вызова. –

+0

Это полезно, и я вижу, как получить (1) строку * номер *, а также (2) метод вызова * из этого. Но мне непонятно, как собрать их вместе, чтобы получить реальную строку кода. –

+0

@ Dan, @Steven: Я расширил свой ответ. –

0

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

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