2012-06-28 46 views
11

Tôi đang cố gắng lấy MethodInfo của một phương thức tĩnh trong một lớp tĩnh. Khi chạy dòng sau, tôi chỉ nhận được những cơ bản 4 phương pháp, ToString, Equals, GetHashCode và GetType:Lấy MethodInfo của phương thức tĩnh của một lớp tĩnh

MethodInfo[] methodInfos = typeof(Program).GetMethods(); 

Làm thế nào tôi có thể nhận được các phương pháp khác được thực hiện trong lớp này?

Trả lời

9
var methods = typeof(Program).GetMethods(BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); 
+1

Trong trường hợp đó tôi nhận được 0 phương thức trở lại ... Có vấn đề gì nếu tôi chạy nó từ cùng một lớp hoặc từ phương thức chính? – Urik

+2

Cập nhật ... để có được tất cả các phương pháp, cả tĩnh lẫn ví dụ, công khai và phi công cộng –

+0

Giống như một sự quyến rũ! Cảm ơn! – Urik

0

Bạn phải yêu cầu một cách rõ ràng các thành viên tĩnh.

+0

Không phải lúc nào. Điều gì sẽ xảy ra nếu tôi muốn tạo một 'MethodCallExpression' từ một phương thức tĩnh bằng cách sử dụng 'Expression.Call'? –

5

Hãy thử cách này:

MethodInfo[] methodInfos = typeof(Program).GetMethods(BindingFlags.Static | BindingFlags.Public); 
2

Ngoài ra nếu bạn biết phương pháp tĩnh của bạn và được tiếp cận với nó tại một thời điểm biên dịch, bạn có thể sử dụng Expression lớp để có được MethodInfo mà không trực tiếp sử dụng phản ánh (có thể gây ra lỗi thời gian chạy bổ sung):

public static void Main() 
{ 
    MethodInfo staticMethodInfo = GetMethodInfo(() => SampleStaticMethod(0, null)); 

    Console.WriteLine(staticMethodInfo.ToString()); 
} 

//Method that is used to get MethodInfo from an expression with a static method call 
public static MethodInfo GetMethodInfo(Expression<Action> expression) 
{ 
    var member = expression.Body as MethodCallExpression; 

    if (member != null) 
     return member.Method; 

    throw new ArgumentException("Expression is not a method", "expression"); 
} 

public static string SampleStaticMethod(int a, string b) 
{ 
    return a.ToString() + b.ToLower(); 
} 

Thông số thực tế này được chuyển đến một số SampleStaticMethod không quan trọng vì chỉ có nội dung là SampleStaticMethod được sử dụng, vì vậy bạn có thể vượt qua null và các giá trị mặc định cho nó.

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