2009-08-21 47 views
32

thể trùng lặp:
How can I find the method that called the current method?Nhận Gọi tên hàm từ chức năng gọi

Làm thế nào tôi có thể nhận được tên gọi hàm từ gọi hàm trong C#?

+1

Bản sao của http://stackoverflow.com/questions/171970/how-can-i-find-the-method-that-called-the-current-method –

+2

Đây là bản dupe, nhưng có lẽ đáng để mở do với thuật ngữ khác - có thể hữu ích cho những người tìm kiếm. – Keith

+1

@Keith: vâng, vì lý do đó, chúng tôi thường cố gắng giữ các câu hỏi trùng lặp xung quanh khi chúng được hỏi theo cách khác nhau đáng kể - đó là lý do tại sao việc đóng chúng lại tự động thêm liên kết ngay trên đầu, vì vậy những người tìm kiếm trong tương lai có thể tìm đường đến câu trả lời nhanh hơn. – Shog9

Trả lời

70
new StackFrame(1, true).GetMethod().Name 

Lưu ý rằng trong phiên bản xây dựng trình biên dịch có thể inline phương pháp này được gọi là, trong trường hợp này mã trên sẽ trả lại người gọi của người gọi, vì vậy để được an toàn, bạn nên trang trí phương pháp của bạn với:

[MethodImpl(MethodImplOptions.NoInlining)] 
+11

Hãy coi chừng việc đi bộ ngăn xếp theo cách này sẽ áp đặt một hiệu suất khá nặng. Tôi khuyên bạn nên tìm một giải pháp không liên quan đến việc đi bộ xếp chồng trước khi sử dụng. – jrista

+1

Câu trả lời này thực sự tốt hơn câu trả lời trong câu hỏi trùng lặp vì đề cập đến thuộc tính MethodImpl. –

+8

Tôi biết đây là một bản dupe và được gắn thẻ .net 3.5, nhưng để giúp những người tìm kiếm vấp ngã cái này đầu tiên (như tôi), nó sẽ là tốt để chỉ ra câu trả lời của bạn rằng trong C# 5.0 bạn có thể sử dụng thông tin người gọi như được mô tả trong: http://visualstudiomagazine.com/articles/2012/11/01/more-than-just-async.aspx – acarlon

14

Điều này sẽ giúp bạn có được tên của phương pháp này bạn đang ở:

string currentMethod = System.Reflection.MethodBase.GetCurrentMethod().Name; 

Sử dụng một cách thận trọng vì có thể là một buổi biểu diễn hit.

To get callers: 
StackTrace trace = new StackTrace(); 
int caller = 1; 

StackFrame frame = trace.GetFrame(caller); 

string callerName = frame.GetMethod().Name; 

Điều này sử dụng bộ sưu tập ngăn xếp để lấy tên phương thức. Giá trị của người gọi là cách xa cuộc gọi ngăn xếp để đi. Cẩn thận đừng đi xa.

+0

Tôi cần phương thức nào gọi phương thức hiện tại. – Sauron

+0

Cách bạn nhận được tên của người gọi từ theo dõi ngăn xếp, nó sẽ là một hit hiệu suất? – Panos

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