С# или VB.NET - Итерировать все общедоступные записи

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

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

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

Ответ 1

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

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

foreach (Type t in query)
{
    Console.WriteLine(t);
}

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

IEnumerable<Type> enums = assembly.GetTypes.Where(t => t.IsEmum);

Ответ 5

Если у вас есть все 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
*/

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