2011-01-16 28 views
7
public static void Main(string[] args) 
{ 
    Action a =() => Console.WriteLine(MethodInfo.GetCurrentMethod().Name); 
    a(); 
} 

Mã này sẽ trả về một chuỗi tối nghĩa như vậy: <Main>b__0.Sử dụng MethodInfo.GetCurrentMethod() bằng các phương thức nặc danh

Có cách nào bỏ qua các phương thức ẩn danh và nhận tên phương thức dễ đọc hơn không?

+6

Và tên gì bạn mong đợi cho một phương pháp _anonymous_ ?? –

+0

Tôi không có mối hận thù nào đối với MS anon. trình tạo tên phương thức. Tôi chỉ tự hỏi nếu có một cách để đào trong dấu vết ngăn xếp cho phương pháp vô danh gần nhất? Có cách nào để biết rằng một cá thể MethodInfo là ẩn danh không? – HuBeZa

Trả lời

6

Bạn có thể nắm bắt được nó ở bên ngoài :

var name = MethodInfo.GetCurrentMethod().Name + ":subname"; 
Action a =() => Console.WriteLine(name); 

Khác hơn thế; Không.

+0

Yes. Tôi nghĩ rằng các biến bị bắt là giải pháp tốt nhất và đơn giản nhất. – HuBeZa

6

Không, không có. Đó là lý do tại sao nó là một phương pháp nặc danh. Tên được tạo tự động bởi trình biên dịch và được bảo đảm là duy nhất. Nếu bạn muốn có được tên phương pháp gọi điện thoại bạn có thể vượt qua nó như là đối số:

public static void Main() 
{ 
    Action<string> a = name => Console.WriteLine(name); 
    a(MethodInfo.GetCurrentMethod().Name); 
} 

hoặc nếu bạn thực sự muốn có một tên có ý nghĩa bạn sẽ cần phải cung cấp cho nó:

public static void Main() 
{ 
    Action a = MeaningfullyNamedMethod; 
    a(); 
} 

static void MeaningfullyNamedMethod() 
{ 
    Console.WriteLine(MethodInfo.GetCurrentMethod().Name); 
} 
+0

Thật không may, tôi không thể chuyển các tham số vì đó là API của bên thứ 3 và tôi không muốn bọc nó chỉ vì điều đó. Có cách nào để đào bới theo dõi ngăn xếp không? Có cách nào để biết rằng một cá thể 'MethodInfo' là vô danh không? – HuBeZa

+2

@HuBeZa, bạn có thể kiểm tra xem MethodInfo có được trang trí với thuộc tính '[CompilerGenerated]' hay không. Đây là một điều kiện cần thiết và một candudate tốt là một phương thức nặc danh nhưng rõ ràng là không đủ điều kiện: 'var isCompilerGenerated = MethodInfo.GetCurrentMethod(). IsDefined (typeof (CompilerGeneratedAttribute), true);' –

3

Nếu bạn đang tìm kiếm tên của hàm mà phương thức ẩn danh nằm trong đó, bạn có thể di chuyển ngăn xếp và nhận tên của phương thức gọi. Tuy nhiên, lưu ý rằng điều này sẽ chỉ hoạt động miễn là tên phương thức mong muốn của bạn là một bước trong hệ thống phân cấp. Có thể có một cách di chuyển cho đến khi bạn đạt đến một phương pháp không ẩn danh.

Để biết thêm thông tin xem: http://www.csharp-examples.net/reflection-calling-method-name/

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