2016-06-23 15 views
5

Tôi muốn lấy tên phương thức từ bên trong. Điều này có thể được thực hiện bằng cách sử dụng reflection như được hiển thị bên dưới. Nhưng, tôi muốn có được điều đó mà không sử dụng reflectionCách lấy tên phương thức từ bên trong phương thức đó mà không sử dụng sự phản chiếu trong C#

System.Reflection.MethodBase.GetCurrentMethod().Name 

Mẫu mã

public void myMethod() 
{ 
    string methodName = // I want to get "myMethod" to here without using reflection. 
} 

Trả lời

19

Từ C# 5 trở đi bạn có thể nhận được biên dịch để điền vào cho bạn, như thế này:

using System.Runtime.CompilerServices; 

public static class Helpers 
{ 
    public static string GetCallerName([CallerMemberName] caller = null) 
    { 
     return caller; 
    } 
} 

Trong MyMethod:

public static void MyMethod() 
{ 
    ... 
    string name = Helpers.GetCallerName(); // Now name=="MyMethod" 
    ... 
} 

Lưu ý rằng bạn có thể sử dụng này sai bằng cách chuyển giá trị một cách rõ ràng:

string notMyName = Helpers.GetCallerName("foo"); // Now notMyName=="foo" 

Trong C# 6, cũng có nameof:

public static void MyMethod() 
{ 
    ... 
    string name = nameof(MyMethod); 
    ... 
} 

Điều đó không đảm bảo rằng bạn đang sử dụng tên giống như tên phương pháp, mặc dù - nếu bạn sử dụng nameof(SomeOtherMethod) nó sẽ có một giá trị của "SomeOtherMethod" của khóa học. Nhưng nếu bạn làm đúng, hãy cấu trúc lại tên của MyMethod thành một cái gì đó khác, bất kỳ công cụ tái cấu trúc nửa nào cũng sẽ thay đổi việc sử dụng của bạn là nameof.

+0

Cảm ơn bạn rất nhiều! –

+0

Cảm ơn bạn đã tham khảo từ C# 6.0 –

5

Như bạn nói rằng bạn không muốn làm sử dụng phản ánh Sau đó bạn có thể sử dụng System.Diagnostics để có được tên phương pháp như dưới đây :

using System.Diagnostics; 

public void myMethod() 
{ 
    StackTrace stackTrace = new StackTrace(); 
    // get calling method name 
    string methodName = stackTrace.GetFrame(0).GetMethod().Name; 
} 

Lưu ý: Phản ánh nhanh hơn nhiều so với phương pháp theo dõi ngăn xếp.

+0

Cảm ơn câu trả lời –

+0

@BandaraKamal Câu trả lời của Jon Skeet tốt hơn tôi. Ngoài ra, ông đã đưa ra tài liệu tham khảo từ các phiên bản C# mới nhất. Vì vậy, hãy xem xét chấp nhận câu trả lời của mình. –

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