Простой способ получить все значения Enum в c # - PullRequest
5 голосов
/ 05 августа 2011

Я попробовал небольшую Программу ... Я хочу запустить программу и увидеть все имена методов в классе 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");
    }
}

Это нормально работает, в результате я получил это

 adf
 main
 bdf

Теперь я хочу передать в функцию GetMethods только один параметр и получить результат ... Не думаю, что это хороший способ передать 5 параметров с помощью функции "binary или (|)" ... В BindingFlags Enum - это 19 полей и что это будет, если я хочу передать 18 параметров xD Как я могу сделать это, передавая только одно значение?

Вот 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,
  }
}

Мне кажется, это очень интересный и полезный вопрос ...

Ответы [ 5 ]

5 голосов
/ 05 августа 2011

Приведенный ниже код должен получить значение, содержащее все флаги (его можно легко превратить в универсальный метод), затем вы можете сделать AllFlags & ~FlagToRemove, чтобы получить все флаги, кроме одного.

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"
}
4 голосов
/ 05 августа 2011

Обратите внимание на тело перечисления BindingFlags, все значения имеют степень 2. Таким образом, двоичный код или просто вычисляет сумму предоставленных целочисленных значений. Чтобы передать все флаги, просто отправьте сумму всех значений int. Чтобы передать только некоторые значения, просто отправьте двоичное целое число с 1 в соответствующей позиции флага, который необходимо передать. Пожалуйста, смотрите код ниже.

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

для вашего примера должно быть

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

и когда мы печатаем flag, мы имеем

DeclaredOnly, Instance, Static, Public, NonPublic

и вы можете получить методы

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

Вы правы, это действительно интересный вопрос.

3 голосов
/ 05 августа 2011

Вы можете использовать переменную для хранения интересных флагов и передать их через:

BindingFlags myFlags = BindingFlags.NonPublic | BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static;

foreach (MethodInfo mInfo in typeof(Program).GetMethods(myFlags))
{
     Console.WriteLine(mInfo.Name);
}
3 голосов
/ 05 августа 2011

Статический метод записи:

public static class BindingFlagsHelper
{
    public static BindingFlags GetAllMethods()
    {
        return 
            BindingFlags.NonPublic | 
            BindingFlags.DeclaredOnly | 
            BindingFlags.Public | 
            BindingFlags.Instance | BindingFlags.Static;
    }
}
2 голосов
/ 05 августа 2011

Вы не будете передавать 5 параметров, вы будете передавать только один int, когда bitwise or s будут выполнены, вы можете поставить неограниченные флаги и '|'их и только один sizeof(int) параметр будет передан.Вы можете сделать предварительно вычисленные значения с помощью

const int my_val = flag_1|flag_3|flag_5;

...