我们的源代码中有一个常见组件,其中包含一个非常大的应用程序所需的所有枚举(大约300个!)。
是否有一种使用C#或VB.NET来遍历所有枚举以执行每个枚举上的操作的方法?
这个问题与如何迭代 .NET 类中的所有“公共字符串”属性几乎相关,但我处理的枚举是各种类型的混合。
是否有一种使用C#或VB.NET来遍历所有枚举以执行每个枚举上的操作的方法?
这个问题与如何迭代 .NET 类中的所有“公共字符串”属性几乎相关,但我处理的枚举是各种类型的混合。
var query = Assembly.GetExecutingAssembly()
.GetTypes()
.Where(t => t.IsEnum && t.IsPublic);
foreach (Type t in query)
{
Console.WriteLine(t);
}
这应该能帮助你入门。遍历已加载程序集中的类型,并检查它们是否是枚举类型:
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));
}
无法将类型为“WhereArrayIterator'1[System.Type]'”的对象强制转换为类型“System.Type”。
- ShevekIEnumerable<Type> enums = assembly.GetTypes.Where(t => t.IsEmum);
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
*/
var a = Assembly.Load("MyAssembly");
和var query = a.GetTypes().Where(t => t.IsEnum && t.IsPublic);
让它工作了,但是我该如何使用它们呢?所有的t
都是System.RuntimeType
类型,而我想将它们用作枚举(对这个反射的东西非常陌生!) - Shevekvar values = new List<int>(); var names = new List<string>(); names.AddRange(Enum.GetNames(t)); values.AddRange((IEnumerable<int>) Enum.GetValues(t));
- Shevek