C # или VB.NET - перебрать все публичные перечисления - PullRequest
10 голосов
/ 22 ноября 2010

У нас есть общий компонент в нашем источнике, который содержит все перечисления (приблизительно 300!) Для очень большого приложения.

Есть ли какой-либо способ, используя C # или VB.NET, для перебора всехиз них для выполнения действия над каждым из них?

Вопрос Как перебрать все свойства «публичной строки» в классе .net почти уместно, но перечисления, с которыми я имею делоявляются смесью типов

Ответы [ 5 ]

16 голосов
/ 22 ноября 2010

Что-то в этом роде?

var query = Assembly.GetExecutingAssembly()
                    .GetTypes()
                    .Where(t => t.IsEnum && t.IsPublic);

foreach (Type t in query)
{
    Console.WriteLine(t);
}
3 голосов
/ 22 ноября 2010

Это должно помочь вам начать.Перебирать типы в загруженных сборках;и проверьте, являются ли они перечислением:

List<string> enumValues = new List<string>();
foreach(Type t in AppDomain.CurrentDomain.GetAssemblies().Select(a=>a.GetTypes().Where(t=>t.IsEnum)))
{
    enumValues.AddRange(Enum.GetNames(t));
}
2 голосов
/ 22 ноября 2010

Если у вас есть все enums, скомпилированные в общий enum, вы можете использовать что-то вроде этого:

using System;

namespace SomeApp
{
    class Program
    {
        static void Main(string[] args)
        {
            foreach(MyEnum target in Enum.GetValues(typeof(MyEnum)))
            {
                Console.WriteLine(target.ToString());
                // You can obviously perform an action on each one here.
            }
        }
    }

    enum MyEnum
    {
        One,
        Two,
        Three,
        Four,
        Five
    };
}

/*
Prints...

One
Two
Three
Four
Five
*/

Надеюсь, это поможет вам начать правильный путь.

2 голосов
/ 22 ноября 2010

Предполагается, что у вас есть сборка, в которой находятся перечисления.

IEnumerable<Type> enums = assembly.GetTypes.Where(t => t.IsEmum);
2 голосов
/ 22 ноября 2010

Как только все ваши сборки загружены, вы можете выполнять итерацию по каждой сборке и вызывать GetTypes () для возврата всех типов (вы также можете получить приватные типы, хотя это займет больше времени). Вы можете отфильтровать типы по IsEnum, чтобы получить только те, которые являются типами enum. Обратите внимание, что это также вернет все типы перечислений BCL. Если вам не нужны типы BCL, вам нужно отфильтровать их. Вы можете избавиться от большинства из них, игнорируя сборки, имена которых начинаются с «Система». Кроме того, вы можете проверить, что путь содержит ваш локальный путь, при условии, что все сборки вашего проекта являются локальными для вашего EXE.

...