2010-08-12 32 views
38

Tôi có một thuộc tính tùy chỉnh:Tìm phương pháp mà có thuộc tính tùy chỉnh sử dụng phản ánh

public class MenuItemAttribute : Attribute 
{ 
} 

và một lớp học với một vài phương pháp:

public class HelloWorld 
{ 
    [MenuItemAttribute] 
    public void Shout() 
    { 
    } 

    [MenuItemAttribute] 
    public void Cry() 
    { 
    } 

    public void RunLikeHell() 
    { 
    } 
} 

Làm thế nào tôi có thể nhận được chỉ các phương pháp được trang trí bằng thuộc tính tùy chỉnh?

Cho đến nay, tôi có điều này:

string assemblyName = fileInfo.FullName; 
byte[] assemblyBytes = File.ReadAllBytes(assemblyName); 
Assembly assembly = Assembly.Load(assemblyBytes); 

foreach (Type type in assembly.GetTypes()) 
{ 
    System.Attribute[] attributes = System.Attribute.GetCustomAttributes(type); 

    foreach (Attribute attribute in attributes) 
    { 
     if (attribute is MenuItemAttribute) 
     { 
      //Get me the method info 
      //MethodInfo[] methods = attribute.GetType().GetMethods(); 
     } 
    } 
} 

Những gì tôi cần bây giờ là để có được tên phương pháp, các kiểu trả về, cũng như các thông số nó chấp nhận.

Trả lời

68

Mã của bạn hoàn toàn sai.
Bạn đang lặp qua từng loại loại có thuộc tính, sẽ không tìm thấy bất kỳ loại nào.

Bạn cần phải lặp qua mọi phương thức trên mọi loại và kiểm tra xem nó có thuộc tính của bạn hay không.

Ví dụ:

var methods = assembly.GetTypes() 
         .SelectMany(t => t.GetMethods()) 
         .Where(m => m.GetCustomAttributes(typeof(MenuItemAttribute), false).Length > 0) 
         .ToArray(); 
+0

am i làm nó ass-về-trước đây? gây ra ngay bây giờ tôi tìm tất cả các thuộc tính và sau đó tôi thử và nhận được các phương pháp liên quan –

+0

kỳ lạ đủ với mã của tôi tôi nhận được 2 kết quả, nhưng với ví dụ của bạn tôi nhận được 0 ..... –

+0

Tôi đã thử nó với các lớp học của bạn; nó làm việc cho tôi. Bạn đang tìm kiếm các hội đồng phải không? – SLaks

19
Dictionary<string, MethodInfo> methods = assembly 
    .GetTypes() 
    .SelectMany(x => x.GetMethods()) 
    .Where(y => y.GetCustomAttributes().OfType<MethodAttribute>().Any()) 
    .ToDictionary(z => z.Name); 
Các vấn đề liên quan