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

C#或VB.NET-迭代所有公共枚举,c#,vb.net,enums,iteration,C#,Vb.net,Enums,Iteration,我们在源代码中有一个通用组件,它包含一个非常大的应用程序的所有枚举(大约300!) 是否有任何方法,使用C#或VB.NET,对所有这些文件进行迭代,以便对每个文件执行操作 这个问题几乎是相关的,但是我正在处理的枚举是类型的混合一旦加载了所有程序集,您可以迭代每个程序集并调用GetTypes()返回所有类型(您也可以选择获取私有类型,尽管这需要更长的时间)。您可以按IsEnum筛选类型,以仅获取枚举类型。请注意,这也将返回所有BCL枚举类型。如果你不想要BCL类型,你需要过滤掉它们。您可以通过忽略

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

是否有任何方法,使用C#或VB.NET,对所有这些文件进行迭代,以便对每个文件执行操作


这个问题几乎是相关的,但是我正在处理的枚举是类型的混合

一旦加载了所有程序集,您可以迭代每个程序集并调用GetTypes()返回所有类型(您也可以选择获取私有类型,尽管这需要更长的时间)。您可以按IsEnum筛选类型,以仅获取枚举类型。请注意,这也将返回所有BCL枚举类型。如果你不想要BCL类型,你需要过滤掉它们。您可以通过忽略名称以“System”开头的程序集来删除其中的大多数程序集。或者,您可以检查路径是否包含本地路径,假设所有项目程序集都是EXE的本地程序集。

这应该可以让您开始。遍历加载的程序集中的类型;并检查它们是否为枚举:

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));
}
List enumValues=new List();
foreach(在AppDomain.CurrentDomain.getAssemblys()中键入t。选择(a=>a.GetTypes()。其中(t=>t.IsEnum)))
{
AddRange(Enum.GetNames(t));
}

这是什么意思

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

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

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

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

如果您将所有
枚举编译成一个公共
枚举
,您可以使用以下内容:

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
*/

希望这能让您走上正确的道路。

这会产生运行时错误:
无法将“whererrayiterator”
1[System.type]”类型的对象强制转换为“System.type”。“@Shevek我遇到了相同的异常。事实上,我在另一个上下文中查找异常的原因时发现了这个问题。用SelectMany替换Select可以解决这个问题。我更新了答案。我开始工作(使用
var a=Assembly.Load(“MyAssembly”);
var query=a.GetTypes()。其中(t=>t.IsEnum&&t.IsPublic);
)但接下来如何使用它们呢?所有
t
都属于
System.RuntimeType
类型,我想将它们用作枚举(对于所有这些反射内容来说都是非常新的!)@Shevek:这是一个完全不同的问题。你到底想对所有这些不同的枚举做什么?我需要迭代每个枚举并生成一个SQL插入脚本来创建一个查找表明白了吗<代码>变量值=新列表();变量名称=新列表();names.AddRange(Enum.GetNames(t));values.AddRange((IEnumerable)Enum.GetValues(t))