我想创建一个API,它将枚举名称作为字符串发送,它应该返回枚举值作为字符串列表。 例如,我的项目包含n个枚举
enum WeekDays{Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday }
另一个枚举可能是
enum Colors{ Red,Green,Blue,Yellow }
我的API调用应该是这样的
List<string> GetEnumValuse(string enumName)
所以调用可能就像这个GetEnumValues("WeekDays")
一样,应该返回枚举值列表。
我担心的是我应该使用switch ... case并找出项目中的所有枚举,
相反,有一种方法可以将字符串解析为枚举,并查找是否存在枚举类型的WeekDays或Colors,以便我不需要使用switch ... case。
答案 0 :(得分:2)
如果您拥有枚举的完全限定名称(即名称空间+类名),您可以得到如下结果:
public IEnumerable<string> GetEnumValues(string enumName)
{
foreach (var value in Enum.GetValues(Type.GetType(enumName)))
{
yield return value.ToString();
}
}
被称为:
IEnumerable<string> enumValues = GetEnumValues("ConsoleApplication1.Colors");
基本上,您从反射中获取枚举值,然后将其名称作为字符串返回。
你真的需要命名空间(在这个例子中,它是ConsoleApplication1
),以便用这种方法找到你的枚举,但它是迄今为止我能想到的最简洁的方法。
答案 1 :(得分:1)
如果未找到枚举,此解决方案首先在当前命名空间中搜索,然后在当前AppDomain中执行深度搜索。
public Type DeepSearchType(string name)
{
if(string.IsNullOrWhiteSpace(name))
return null;
foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies())
{
foreach (Type t in a.GetTypes())
{
if(t.Name.ToUpper() == name.ToUpper())
return t;
}
}
return null;
}
public List<string> GetEnumValues(string enumName)
{
List<string> result = null;
var enumType = Type.GetType(enumName);
if(enumType == null)
enumType = DeepSearchType(enumName);
if(enumType != null)
{
result = new List<string>();
var enumValues = Enum.GetValues(enumType);
foreach(var val in enumValues)
result.Add(val.ToString());
}
return result;
}