2011-01-27 16 views
8

Sto eseguendo un caricamento di runtime assembly, ma non conosco i nomi di classi o metodi. Non voglio elencare tutte le classi nel mio assembly con i loro metodi dichiarati, non quelli ereditati da System.Object.Come trovo solo i metodi dichiarati, quando si carica un assembly di runtime?

Questo è il codice:

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

Questa è la 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; 
    } 
} 

Il risultato:

component01 
component02 

And if i remove the bindingflag: 

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

Voglio solo il metodo getMyName mostrato.

risposta

9

Penso che tu sia alla ricerca di bandiere:

BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly 

Si consiglia di mettere in BindingFlags.NonPublic così, a seconda delle vostre esigenze.

Vorrei anche sottolineare che con profonde gerarchie di ereditarietà, i tipi possono ereditare membri provenienti da base-tipi diversiSystem.Object. Se si desidera mantenere quelli, ma non quelli inizialmente dichiarati su object, si potrebbe:

  1. rimuovere il flag BindingFlags.DeclaredOnly per la chiamata GetMethods.
  2. includere solo i metodi di cui:

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

Naturalmente, potrebbe essere necessario un filtro diverso se la definizione di "dichiarato" metodo erano più complicato.

+1

Funziona perfettamente, grazie! Ho provato a utilizzare sia Public e DeclaredOnly in precedenza, ma questo non ha funzionato. Come mai ho bisogno di specificare tutti e tre? – Bildsoe

+0

@Bildsoe: 'System.Reflection.BindingFlags' è un enumerato. Quando il flag 'Instance' non è impostato,' GetMethods' non include i metodi di istanza. – Ani

+1

ok, grazie. Ho solo pensato che, se il metodo fosse uno dei menzionati, sarebbe stato incluso. – Bildsoe

Problemi correlati