2013-08-04 33 views
6

Có thể lấy tên của một phương thức khác trong cùng một lớp nhưng mà không cần sử dụng chuỗi được viết theo cách thủ công không?Cách lấy tên phương thức từ một phương thức đã biết?

class MyClass { 

    private void doThis() 
    { 
     // Wanted something like this 
     print(otherMethod.name.ToString()); 
    } 

    private void otherMethod() 
    { 

    } 
} 

Bạn có thể hỏi tại sao: cũng lý do là tôi phải gọi phương pháp này sau này như Invoke này ("otherMethod"), tuy nhiên tôi không muốn hardcode chuỗi này bản thân mình như tôi không thể refactor nó nữa trong dự án.

+0

bạn có thể sử dụng sự phản ánh để đạt được điều đó. –

+0

Bạn đang sử dụng phiên bản C# nào? – Mehrdad

Trả lời

8

Một cách tiếp cận là bạn có thể quấn nó vào đại biểu Action, sau đó bạn có thể truy cập vào tên của phương pháp:

string name = new Action(otherMethod).Method.Name; 
+1

Cảm ơn công trình này! Tôi đã nhìn vào GetType() và GetMethods() nhưng "hành động mới" này mà tôi chưa từng nghe đến. Câu hỏi nhỏ: khi tôi sử dụng Hành động mới, tôi hy vọng phương pháp bên trong không được thực hiện (nó chỉ có tên), điều đó có đúng không? – Malvin

+2

Nếu bạn đi với cách tiếp cận đại biểu bạn không cần phải nhận được tên (và do đó bỏ qua gọi qua phản ánh) - chỉ cần sử dụng kết quả 'Hành động' để thực thi phương pháp sau này. –

+2

Woah! Khá tuyệt vời, tôi không biết rằng bạn có thể làm điều đó. –

2

Bạn có thể sử dụng phản xạ (ví dụ - http://www.csharp-examples.net/get-method-names/) để có được tên phương pháp. Sau đó, bạn có thể tìm phương pháp mà bạn đang tìm kiếm theo tên, tham số hoặc thậm chí sử dụng một thuộc tính để gắn thẻ nó.

Nhưng câu hỏi thực sự là - bạn có chắc đây là những gì bạn cần không? Điều này có vẻ như bạn không thực sự cần phản ánh, nhưng cần phải suy nghĩ về thiết kế của bạn. Nếu bạn đã biết bạn sẽ gọi phương thức nào, tại sao bạn cần tên? Làm thế nào về việc sử dụng một đại biểu? Hoặc phơi bày phương thức thông qua một giao diện và lưu trữ một tham chiếu đến một số lớp thực hiện nó?

1

Hãy thử điều này:

MethodInfo method = this.GetType().GetMethod("otherMethod"); 
object result = method.Invoke(this, new object[] { }); 
0

Btw. Tôi cũng tìm thấy (trong các mở rộng của internet) một giải pháp thay thế cho chỉ nhận được chuỗi của một phương pháp. Nó cũng hoạt động với các tham số và kiểu trả về:

System.Func<float, string> sysFunc = this.MyFunction; 
string s = sysFunc.Method.Name; // prints "MyFunction" 

public string MyFunction(float number) 
{ 
    return "hello world"; 
} 
+0

Đây là phương pháp được sử dụng bởi câu trả lời được chấp nhận. – Servy

+0

Sự khác biệt duy nhất là, điều này cũng hoạt động trên các phương pháp không có giá trị. – Malvin

+0

Cách tiếp cận này giống hệt nhau, rõ ràng bạn cần phải sử dụng loại 'Hành động' /' Func' khớp với chữ ký của phương thức. Ví dụ trong OP là hàm void ít tham số, có nghĩa là 'Hành động'. Bạn * không thể * sử dụng 'Func' cho một phương thức như vậy. – Servy

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