2011-01-27 20 views
8

Estoy haciendo una carga de ensamblaje en tiempo de ejecución, pero no sé los nombres de ninguna clase o método. Quiero enumerar todas las clases en mi ensamblado con sus métodos declarados, no los heredados de System.Object.¿Cómo encuentro solo los métodos declarados al realizar una carga de ensamblaje en tiempo de ejecución?

Este es el código:

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

Ésta es 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; 
    } 
} 

El resultado:

component01 
component02 

And if i remove the bindingflag: 

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

que sólo quieren el método getMyName muestra.

Respuesta

9

Creo que estás en busca de las banderas:

BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly 

Es posible que desee poner en BindingFlags.NonPublic así, dependiendo de sus necesidades.

Me gustaría también señalar que con las jerarquías de herencia más profundos, los tipos pueden heredar los miembros de base-tipos distintos de System.Object. Si desea mantener esos, pero no los que declaró originalmente en object, usted podría:

  1. quitar la bandera BindingFlags.DeclaredOnly para la llamada GetMethods.
  2. incluir sólo los métodos por los cuales:

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

Por supuesto, es posible que necesite un filtro diferente si su definición de "declarada" método eran más complicadas.

+1

Funciona perfectamente, gracias! Intenté usar Public y DeclaredOnly anteriormente, pero esto no funcionó. ¿Cómo es que necesito especificar los tres? – Bildsoe

+0

@Bildsoe: 'System.Reflection.BindingFlags' es un flags-enum. Cuando el indicador 'Instance' no está configurado,' GetMethods' no incluye métodos de instancia. – Ani

+1

bien, gracias. Solo pensé que, si el método fuera uno de los mencionados, se incluiría. – Bildsoe

Cuestiones relacionadas