Простой способ получить все значения Enum в C#

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

Решение

Обратите внимание на тело перечисления 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);

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

Приведенный ниже код должен получить значение, содержащее все флаги (можно легко превратить в универсальный метод), затем вы можете сделать 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"
}

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

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

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

Напишите статический метод:

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

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

const int my_val = flag_1|flag_3|flag_5;

Другие вопросы по тегам