从字符串中查找枚举类型并将枚举值返回为List <string> </string>

时间:2015-01-08 06:35:41

标签: c# .net enums

我想创建一个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。

2 个答案:

答案 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;
}