2010-02-16 4 views
1

Я постараюсь объяснить, в чем я нуждаюсь.Как получить имя родительского метода/имя класса/файла внутри другого вызова метода?

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

Public Class Example1 

    Public Sub ToBeCalled() 

     System.Console.WriteLine(
      "The Method or Class or file and its line which called me is: ", 
      ?????) 

    End Sub 

End Class 

Тогда у меня есть второй класс вроде этого:

Public Class Second 

    Public Sub SomeProcedure() 

     Dim obj As Example1 = New Example1 

     obj.ToBeCalled() 

    End Sub 

End Class 

Module1 
    Dim obj2 As Second = New Second() 

    obj2.SomeProcedure() 

End Module1 

И что я хотел бы получить на экране вместо " ????» является:

1) Метод или класс или файл, и его линия, которая позвала меня есть: Второй

2) Метод или класс или файл, и его линия, которая позвала меня является: SomeProcerure

3) ...... это: Second.vb

4) ...... это: линия 54

5) ....... является: колонка 33

Может кто-нибудь Помоги мне, пожалуйста?

+0

Можете ли вы исправить раздел кода в своем вопросе, чтобы он отображался в виде кода? Спасибо –

ответ

0

Вы ищете класс StackTrace.

Обратите внимание, что вы можете получать номера строк в сборке отладки с PDB-файлом.

Также обратите внимание, что перед методом следует добавить <MethodImpl(MethodImplOptions.NoInlining)> _.

+0

Почему это было downvoted? – SLaks

0

Чтобы получить номер вызывающего абонента (также номера столбцов и строк), вы должны использовать класс System.Diagnostics.StackTrace.

StackTrace stackTrace = new StackTrace(); 
StackFrame stackFrame = stackTrace.GetFrame(1); 
MethodBase methodBase = stackFrame.GetMethod(); 
+0

Да, я думал о классе StackTrace, но я не знаю, какой фрейм я должен использовать?Проблема в том, что я получаю имя как: _Lambda $ __ 1 :( – truthseeker

+0

0: _info 1: _Lambda $ __ 1 2: ThreadStart_Context 3: runTryCode 4: ExecuteCodeWithGuaranteedCleanup 5: RunInternal 6: Запуск 7: ThreadStart Я перечислил все фреймы стека и нет имени метода, которое называется вторым. :(Я имею в виду, что есть прямой метод в том же классе, но ничего не указывает на другой. :(Есть ли кто-нибудь, кто мне поможет? – truthseeker

0

Класс StackTrace может предоставить вам необходимую информацию.

Простой способ доступа к этой информации в настоящее время рассматривается для VB 11: Lucian's VBlog: Power6: CALLER_MEMBER.

1

Вы всегда можете использовать StackTrace class. Это позволит вам пройти стек, чтобы узнать информацию о методах, которые приводят к вызову вашего метода.

В вашем случае, вы хотите использовать StackFrame class, как вы хотите только один конкретного кадра (вы можете использовать класс StackTrace, но он будет делать весь след, и в этом случае, вы просто хотите один Рамка). С помощью экземпляра StackTrace вы можете вызвать GetMethod method, чтобы получить экземпляр MethodBase, который представляет метод, выполняющий вызов.

Вот пример, это в C#, но легко переводимое в VB.NET:

// Skip the current stack frame, get the caller. 
StackFrame stackFrame = new StackFrame(1); 

// Print out the method name. 
Console.WriteLine(stackFrame.GetMethod().Name); 

Обратите внимание, что если вы хотите вывод дополнительной информации, как номер строки, и т.д., и т.д., вы должны обеспечить отладочную сборку с файлом PDB.

+1

Кроме того, чтобы получить всю информацию, которую он запрашивает, она должна быть сборкой Debug с присутствующим файлом PDB. – Nick

+0

@Nick: Спасибо, я обновил свой ответ, чтобы отразить это. – casperOne

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