2011-08-05 8 views
5

He intentado un pequeño programa ... Quiero ejecutar un programa y ver todos los nombres de los métodos de clase C# ... Este es el códigomanera fácil de obtener todos los valores de enumeración en C#

class Program 
{ 
    public int adf() 
    { 
     return 0; 
    } 
    static void Main(string[] args) 
    { 

     foreach (MethodInfo mInfo in typeof(Program).GetMethods(BindingFlags.NonPublic | BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static)) 
     { 
      Console.WriteLine(mInfo.Name); 
     } 
     Console.ReadKey(); 
    } 
    private void bdf() 
    { 
     Console.WriteLine("Dg"); 
    } 
} 

está bien el trabajo, en consecuencia tengo este

adf 
main 
bdf 

Ahora, quiero pasar a getMethods funcionan sólo un parámetro y obtener resultado ... no creo que es una buena manera de pasar 5 parámetros con 'binary or (|)' ... En BindingFlags Enum son 19 campos y lo que será si quiero pa ss 18 parámetros xD ¿Cómo puedo hacerlo pasando solo un valor?

Aquí está Enum

public enum BindingFlags 
{ 
    Default = 0, 
    IgnoreCase = 1, 
    DeclaredOnly = 2, 
    Instance = 4, 
    Static = 8, 
    Public = 16, 
    NonPublic = 32, 
    FlattenHierarchy = 64, 
    InvokeMethod = 256, 
    CreateInstance = 512, 
    GetField = 1024, 
    SetField = 2048, 
    GetProperty = 4096, 
    SetProperty = 8192, 
    PutDispProperty = 16384, 
    PutRefDispProperty = 32768, 
    ExactBinding = 65536, 
    SuppressChangeType = 131072, 
    OptionalParamBinding = 262144, 
    IgnoreReturn = 16777216, 
    } 
} 

Creo que es muy interesante y útil cuestión ...

+6

Técnicamente, usted no hace una pregunta ... – Oded

+0

Cómo puedo hacerlo pasar sólo un valor? –

+1

Puede _editar_ la pregunta y agregarla. Mejor que ponerlo en un comentario. – Oded

Respuesta

4

attantion paga en el cuerpo del BindingFlags enumeración, todos los valores son potencia de 2. Por lo tanto binaria o simplemente calcula la suma de los valores enteros proporcionados. Para pasar todas las banderas solo envíe la suma de todos los valores int. Para pasar solo algunos valores solo envíe un número entero binario con 1 en la posición correspondiente de la bandera que necesita ser pasada. Por favor vea el código a continuación.

BindingFlags flag = (BindingFlags)Convert.ToInt32("0000010010000101010", 2) 

por su ejemplo debe haber

BindingFlags flag = (BindingFlags)Convert.ToInt32("111110", 2) 

y cuando imprimimos el flag tenemos un

DeclaredOnly, Instance, Static, Public, NonPublic 

y usted puede conseguir metods

  Type t = typeof(Program); 
      MethodInfo[] mi = t.GetMethods(flag); 

Se derecha, es realmente interesante pregunta.

+0

El único problema que veo es el de la legibilidad: no hay forma de saber qué banderas se usan realmente sin conocer los valores de Enum. – Oded

+0

Sí, esta es una gran manera ... ¡Todo lo que quiero es esto! –

+1

Todas las respuestas hasta ahora son viables * excepto por esta *. Funcionará, pero hacerlo así es solo pedir problemas en el futuro. Un solo error de "1" o "0" es todo lo que se necesita para romper cosas, y todo para guardar un poco de tipeo. – LukeH

3

Escribir método estático:

public static class BindingFlagsHelper 
{ 
    public static BindingFlags GetAllMethods() 
    { 
     return 
      BindingFlags.NonPublic | 
      BindingFlags.DeclaredOnly | 
      BindingFlags.Public | 
      BindingFlags.Instance | BindingFlags.Static; 
    } 
} 
+1

Quiero fácil y corto camino ... Tu camino es el mismo que el mío, no veo ninguna diferencia)))) –

+1

+1 - Votación no garantizada – Oded

3

Se puede utilizar una variable para contener las banderas interesantes y pasar que a través de:

Código
BindingFlags myFlags = BindingFlags.NonPublic | BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static; 

foreach (MethodInfo mInfo in typeof(Program).GetMethods(myFlags)) 
{ 
    Console.WriteLine(mInfo.Name); 
} 
5

continuación debe recibir un valor que contiene todas las banderas (podría ser fácilmente convertido en un método genérico), puede hacer AllFlags & ~FlagToRemove para obtener todos los indicadores excepto uno.

AllFlags = (EnumFlagType)Enum.GetValues(typeof(EnumFlagType)) 
          .Cast<int>().Aggregate((acc, next) => acc | next); 

[Flags] 
enum TestEnum { one = 1, two = 2, three = 4, four = 8 }; 

void Main() 
{ 

    var AllFlags = (TestEnum)Enum.GetValues(typeof(TestEnum)) 
          .Cast<int>().Aggregate((acc, next) => acc | next); 

    Console.WriteLine(AllFlags); // Prints "one, two, three, four" 

    Console.WriteLine(AllFlags & ~two); // Prints "one, three, four" 
} 
+0

+1 Creo que este es el enfoque más genérico – sll

+2

No creo llamar a 'Suma' es una buena idea aquí. Esto fallará si tiene 'máscaras' o valores compuestos definidos en la enumeración. Probablemente desee un 'BitwiseOr()' en lugar de 'Suma()'. – leppie

+0

@leppie, buena captura, no pensó en valores de máscara. –

2

No se le pasa 5 parámetros, se le único int pasando cuando los bitwise or s se llevan a cabo la ejecución, podría poner banderas ilimitadas y '|' ellos y solo se pasará un parámetro sizeof(int). Se podría hacer que los valores calculados previamente con

const int my_val = flag_1|flag_3|flag_5;

Cuestiones relacionadas