C#或VB.NET - 迭代所有公共枚举

时间:2010-11-22 16:02:46

标签: c# vb.net enums iteration

我们的源代码中有一个通用组件,其中包含一个非常大的应用程序的所有枚举(大约300!)。

有没有办法,使用C#或VB.NET来迭代所有这些,以便对每个进行操作?

问题How to iterate all “public string” properties in a .net class几乎是相关的,但我正在处理的枚举是混合类型

5 个答案:

答案 0 :(得分:16)

这些方面的东西?

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

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

答案 1 :(得分:3)

这应该让你开始。迭代加载的程序集中的类型;并检查它们是否是枚举:

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 :(得分:2)

加载完所有程序集后,您可以遍历每个程序集并调用GetTypes()以返回所有类型(您也可以选择获取私有类型,但这会花费更长时间)。您可以通过IsEnum过滤类型以仅获取枚举类型的类型。请注意,这也将返回所有BCL枚举类型。如果您不想要BCL类型,则需要将其过滤掉。您可以通过忽略名称以“System”开头的程序集来摆脱大多数程序。或者,您可以检查路径是否包含本地路径,假设您的所有项目程序集都是EXE的本地程序。

答案 3 :(得分:2)

假设您有枚举所在的程序集。

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

答案 4 :(得分:1)

如果您将所有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
*/

希望这可以让你开始走正确的道路。

相关问题