2012-07-06 44 views
15

Làm cách nào để tìm tên đầy đủ của phương thức gọi trong C#. Tôi đã thấy các giải pháp:Cách tìm tên ĐẦY ĐỦ của phương thức gọi C#

How I can get the calling methods in C#

How can I find the method that called the current method?

Get Calling function name from Called function

Nhưng họ chỉ cung cấp cho tôi những cấp cao nhất. Hãy xem xét ví dụ:

namespace Sandbox 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      test(); 
     } 

     static void test() 
     { 
      var stackTrace = new StackTrace(); 
      var methodBase = stackTrace.GetFrame(1).GetMethod(); 
      Console.WriteLine(methodBase.Name); 
     } 
    } 
} 

Điều này chỉ đơn giản là kết quả 'Chính' Làm cách nào để in 'Sandbox.Program.Main'?

Trước khi mọi người bắt đầu hỏi lý do tại sao tôi cần phải sử dụng điều này, nó cho một khung đăng nhập đơn giản mà tôi đang làm việc.

EDIT

Thêm vào trả lời Matzi của:

Dưới đây là giải pháp:

namespace Sandbox 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      test(); 
     } 

     static void test() 
     { 
      var stackTrace = new StackTrace(); 
      var methodBase = stackTrace.GetFrame(1).GetMethod(); 
      var Class = methodBase.ReflectedType; 
      var Namespace = Class.Namespace;   //Added finding the namespace 
      Console.WriteLine(Namespace + "." + Class.Name + "." + methodBase.Name); 
     } 
    } 
} 

Tạo 'Sandbox.Program.Main' như nó nên

+1

thể trùng lặp của [Sử dụng System.Reflection để Nhận một phương pháp Full Name] (http://stackoverflow.com/questions/2968352/using-system-reflection-to-get-a-methods-full -name) – user7116

Trả lời

27

Đây là một cái gì đó như here.

MethodBase method = stackTrace.GetFrame(1).GetMethod(); 
string methodName = method.Name; 
string className = method.ReflectedType.Name; 

Console.WriteLine(className + "." + methodName); 
+0

Cảm ơn! Tôi đã chỉnh sửa câu hỏi chỉ để thêm vào cách tôi đã tìm ra để tìm Không gian tên. –

+2

Không hoạt động. Phương thức này có thể không phải là phương thức gọi nhưng một trong những phương thức bên ngoài - phương thức gọi điện có thể không tồn tại nữa, tức là đã được inlined. – TomTom

+0

Có thể nhận các lớp lồng nhau không? Nếu tôi tạo một lớp bên trong Program, hãy gọi nó là 'Foo', và tôi có một phương thức trong' Foo' (gọi nó là 'Bar') gọi là' Program.test() 'Nó sẽ in' Sandbox.Program.Foo .Bar' –

0

trong System.Reflection.MethodBase phương pháp GetCurrentMethod bạn có thể tìm thấy thông tin đầy đủ về callstack sử dụng các lớp học vv

+0

Làm cách nào? ['GetCurrentMethod'] (https://msdn.microsoft.com/en-us/library/system.reflection.methodbase.getcurrentmethod (v = vs.110) .aspx) trả về một [' MethodBase'] (https://msdn.microsoft.com/en-us/library/system.reflection.methodbase(v=vs.110).aspx) dường như không hiển thị bất kỳ thứ gì về dấu vết ngăn xếp (ngoại trừ loại hiện tại). – c24w

4

Tôi nghĩ rằng cách tốt nhất để có được tên đầy đủ là:

this.GetType().FullName + "." + System.Reflection.MethodBase.GetCurrentMethod().Name; 

hoặc thử này

string method = string.Format("{0}.{1}", MethodBase.GetCurrentMethod().DeclaringType.FullName, MethodBase.GetCurrentMethod().Name); 
0

Với phương pháp này, bạn có thể nhận được đầy đủ một cách đáng tin cậy tên

public void HandleException(Exception ex, [CallerMemberName] string caller = "") 
    { 
     if (ex != null) 
     { 
      while (ex.InnerException != null) 
       ex = ex.InnerException; 

      foreach (var method in new StackTrace().GetFrames()) 
      { 
       if (method.GetMethod().Name == caller) 
       { 
        caller = $"{method.GetMethod().ReflectedType.Name}.{caller}"; 
        break; 
       } 
      } 

      Console.WriteLine($"Exception: {ex.Message} Caller: {caller}()"); 
     } 
    } 
Các vấn đề liên quan