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