2011-01-27 27 views
8

Tôi đang thực hiện tải lắp ráp thời gian chạy, nhưng tôi không biết tên của bất kỳ lớp hoặc phương pháp nào. Tôi không liệt kê tất cả các lớp trong assembly của tôi với các phương thức được khai báo của chúng, không phải các lớp được thừa kế từ System.Object.Làm cách nào để tìm các phương thức được khai báo, khi thực hiện tải lắp ráp thời gian chạy?

Đây là mã:

string str = ""; 
Assembly assembly = Assembly.LoadFile(@"c:\components.dll");  

foreach (Type type in assembly.GetTypes()) 
{ 
    if (type.IsClass == true) 
    {  
     str += type.Name + "\n";  
     MethodInfo[] methodInfo = type.GetMethods(BindingFlags.DeclaredOnly); 

     foreach (MethodInfo mi in methodInfo) 
     {  
      str += "\t" + mi.Name + "\n";  
     }  
    } 
} 

MessageBox.Show(str); 

Đây là components.dll:

public class component01 
{  
    public string myName = "component01"; 
    public string getMyName() 
    { 
     return myName; 
    } 
} 

public class component02 
{  
    public string myName = "component02"; 

    public string getMyName() 
    { 
     return myName; 
    } 
} 

Kết quả:

component01 
component02 

And if i remove the bindingflag: 

component01 
    getMyName 
    ToString 
    Equals 
    GetHashcode 
    GetType 
component02 
    getMyName 
    ToString 
    Equals 
    GetHashcode 
    GetType 

Tôi chỉ muốn getMyName phương pháp thể hiện.

Trả lời

9

Tôi nghĩ rằng bạn đang tìm kiếm những lá cờ:

BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly 

Bạn có thể muốn đưa vào BindingFlags.NonPublic là tốt, tùy thuộc vào yêu cầu của bạn.

Tôi cũng chỉ ra rằng với phân cấp thừa kế sâu hơn, các loại có thể kế thừa các thành viên từ các loại cơ sở khác vớiSystem.Object. Nếu bạn muốn giữ lại những người, nhưng không phải là những ban đầu tuyên bố trên object, bạn có thể:

  1. Tháo BindingFlags.DeclaredOnly cờ cho GetMethods gọi.
  2. Chỉ bao gồm các phương pháp đó:

    methodInfo.GetBaseDefinition().DeclaringType != typeof(object) 
    

Tất nhiên, bạn có thể cần một bộ lọc khác nhau nếu định nghĩa của bạn về "tuyên bố" phương pháp là phức tạp hơn.

+1

Hoạt động hoàn hảo, cảm ơn! Tôi đã thử sử dụng cả hai công khai và DeclaredOnly trước đây, nhưng điều này đã không làm việc. Làm thế nào đến tôi cần phải xác định cả ba? – Bildsoe

+0

@Bildsoe: 'System.Reflection.BindingFlags' là cờ-enum. Khi cờ 'Instance' không được thiết lập,' GetMethods' không bao gồm các phương thức instance. – Ani

+1

ok, cảm ơn. Tôi chỉ nghĩ rằng, nếu phương pháp đó là bất kỳ đề cập nào, nó sẽ được đưa vào. – Bildsoe

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