2011-01-27 8 views
8

Robię ładowanie zestawu środowiska wykonawczego, ale nie znam nazw żadnych klas ani metod. Nie będę wymieniał wszystkich klas w moim zestawie z zadeklarowanymi metodami, a nie dziedziczonych z System.Object.Jak znaleźć tylko deklarowane metody podczas ładowania zestawu środowiska wykonawczego?

Jest to kod:

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); 

To 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; 
    } 
} 

Rezultat:

component01 
component02 

And if i remove the bindingflag: 

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

chcę tylko metodę getMyName pokazany.

Odpowiedz

9

myślę szukasz flagami:

BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly 

Możesz umieścić w BindingFlags.NonPublic jak również, w zależności od wymagań.

Chciałbym również podkreślić, że z głębszych hierarchii dziedziczenia, typy mogą dziedziczyć członków z podstawowych typów innych niżSystem.Object. Jeśli chcesz zachować te, ale nie te, które pierwotnie zadeklarowane object, można:

  1. Usuń flagę BindingFlags.DeclaredOnly na wezwanie GetMethods.
  2. obejmują wyłącznie metody, które:

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

oczywiście, być może trzeba inny filtr, jeśli definicja „ogłoszony” metoda była bardziej skomplikowana.

+1

Działa doskonale, dzięki! Próbowałem wcześniej używać zarówno Public, jak i DeclaredOnly, ale to nie działało. Dlaczego muszę podać wszystkie trzy? – Bildsoe

+0

@Bildsoe: 'System.Reflection.BindingFlags' jest flag-enum. Gdy flaga 'Instance' nie jest ustawiona,' GetMethods' nie zawiera metod instancji. – Ani

+1

ok, dziękuję. Pomyślałem tylko, że gdyby metoda była którąkolwiek z wymienionych, zostałaby włączona. – Bildsoe