我们的源代码中有一个通用组件,其中包含一个非常大的应用程序的所有枚举(大约300!)。
有没有办法,使用C#或VB.NET来迭代所有这些,以便对每个进行操作?
问题How to iterate all “public string” properties in a .net class几乎是相关的,但我正在处理的枚举是混合类型
答案 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
*/
希望这可以让你开始走正确的道路。