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

12
我们的源代码中有一个常见组件,其中包含一个非常大的应用程序所需的所有枚举(大约300个!)。
是否有一种使用C#或VB.NET来遍历所有枚举以执行每个枚举上的操作的方法?
这个问题与如何迭代 .NET 类中的所有“公共字符串”属性几乎相关,但我处理的枚举是各种类型的混合。
5个回答

19
这是什么意思?
var query = Assembly.GetExecutingAssembly()
                    .GetTypes()
                    .Where(t => t.IsEnum && t.IsPublic);

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

我已经通过使用 var a = Assembly.Load("MyAssembly");var query = a.GetTypes().Where(t => t.IsEnum && t.IsPublic); 让它工作了,但是我该如何使用它们呢?所有的t都是System.RuntimeType类型,而我想将它们用作枚举(对这个反射的东西非常陌生!) - Shevek
@Shevek:那是一个完全不同的问题。你到底想用所有这些不同的枚举做什么? - LukeH
我需要迭代每个枚举并生成一个SQL插入脚本来创建一个查找表。 - Shevek
明白了!var values = new List<int>(); var names = new List<string>(); names.AddRange(Enum.GetNames(t)); values.AddRange((IEnumerable<int>) Enum.GetValues(t)); - Shevek

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

1
这会导致运行时错误:无法将类型为“WhereArrayIterator'1[System.Type]'”的对象强制转换为类型“System.Type”。 - Shevek
2
@Shevek 我也遇到了同样的异常。实际上,我是在寻找另一个上下文中该异常的原因时发现了这个问题。通过将Select替换为SelectMany来解决这个问题。我已经更新了答案。 - R. Schreurs

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

2
假设您拥有包含枚举的程序集。
IEnumerable<Type> enums = assembly.GetTypes.Where(t => t.IsEmum);

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

希望这能让你开始走上正确的道路。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接