2009-04-03 38 views
8

Xem ví dụ này:Có thể lấy phương thức tham chiếu trong VB.NET không?

''//file1.vb 
Sub Something() 
    ''//... 
    Functions.LogInfo("some text") 
    ''//... 
End Sub 

''//functions.vb 
Sub LogInfo(ByVal entry as String) 

    Console.WriteLine(entry) 

End Sub 

Tôi có thể lấy tên là "Một cái gì đó" bên LogInfo?

Xin lỗi vì sự ngắn gọn của bài đăng này, tôi không chắc chắn cách nêu rõ câu hỏi này. Tôi sẽ làm rõ và xây dựng khi cần thiết.

Trả lời

12

(EDIT: Removed sử dụng không cần thiết của StackTrace bản thân - đó sẽ là hữu ích nếu bạn muốn in ra thông tin nhiều hơn chỉ là một khung hình.)

Bạn có thể sử dụng lớp StackFrame, nhưng nó khá đắt (IIRC) và có thể hơi không chính xác do nội tuyến.

EDIT: Một cái gì đó như thế này: (các NoInlining là để đảm bảo nó cư xử đúng cách ...)

Imports System.Diagnostics 
Imports System.Runtime.CompilerServices 

Public Class Test 

    Shared Sub Main() 
     Something() 
    End Sub   

    <MethodImpl(MethodImplOptions.NoInlining)> _ 
    Shared Sub Something()   
     Functions.LogInfo("some text") 
    End Sub 

End Class 

Public Class Functions 

    <MethodImpl(MethodImplOptions.NoInlining)> _ 
    Public Shared Sub LogInfo (ByVal entry as String) 
     Dim frame as StackFrame = new StackFrame(1, False) 
     Console.WriteLine("{0}: {1}", _ 
          frame.GetMethod.Name, _ 
          entry) 
    End Sub 

End Class 
+0

Downvoters: bất kỳ lý do cụ thể không? –

6

Hãy xem How can I find the method that called the current method?.

Translated để VB (Hy vọng):

Imports System.Diagnostics 
''// get call stack 
Dim stackTrace As New StackTrace() 

''// get calling method name 
Console.WriteLine(stackTrace.GetFrame(1).GetMethod().Name) 
+0

cảm ơn điều đó đã diễn ra đúng như tôi cần. Tôi tự hỏi tại sao bài viết đó không xuất hiện trong các tìm kiếm của tôi ... – Anders

+0

Lý do duy nhất tôi có thể tìm thấy nó là vì tôi đã từng thấy nó trước đây, tôi phải tìm kiếm StackTrace và GetFrame để làm cho nó hiển thị. Tôi sẽ khuyên bạn nên có lời khuyên của Jon để đảm bảo rằng bạn đang nhận được khung chính xác, anh ấy là chuyên gia .NET IMO. –

+0

Bạn có thể làm tốt hơn thế này - có thể chỉ cần tạo một thể hiện của khung ngăn xếp chính xác mà bạn cần thay vì sao chép toàn bộ ngăn xếp. –

1

Bạn có thể sử dụng StackFrame hoặc StackTrace. Nhưng hành vi của bạn có thể khác nhau trong bản phát hành bản phát hành hoặc chạy trong trình gỡ lỗi do nội tuyến. Vì vậy, kết quả của bạn có thể không phải những gì bạn mong đợi:

C#:

System.Diagnostics.StackFrame sf = new StackFrame(1); 
sf.GetMethod().Name; 

vb:

Dim sf as new StackFrame(1) 
sf.GetMethod().Name 

Sửa

Xin lỗi chỉ nhận ra bạn yêu cầu vb.net. Tôi thay đổi nội dung câu trả lời của tôi, nhưng cú pháp vb có thể không đúng

1

System.Reflection.MethodBase.GetCurrentMethod.Name làm điều tương tự và là dường như dễ dàng hơn để nhận được hang của

Các vấn đề liên quan