将枚举转换为List <string>


102

如何将以下枚举转换为字符串列表?

[Flags]
public enum DataSourceTypes
{
    None = 0,
    Grid = 1,
    ExcelFile = 2,
    ODBC = 4
};

我找不到这个确切的问题,这个到列表的枚举是最接近的,但是我特别想要List<string>

Answers:


177

使用Enum的静态方法GetNames。它返回一个string[],如下所示:

Enum.GetNames(typeof(DataSourceTypes))

如果要创建仅对的一种类型执行此操作的方法,enum并将该数组转换为List,则可以编写如下代码:

public List<string> GetDataSourceTypes()
{
    return Enum.GetNames(typeof(DataSourceTypes)).ToList();
}

您将需要Using System.Linq;在类的顶部使用.ToList()


7
@DCShannon请不要编辑常见问题/答案并缩小解释范围。当您和我理解速记代码时,新手需要所有额外的细节才能将其与他们的学习相关联
杰里米·汤普森

似乎Enum.GetNames(typeof(DataSourceTypes))返回泛型System.Array而不是字符串数组?
sookie

@sookie,请参阅msdn链接,这是GetNames()方法的签名:public static string[] GetNames
Jeremy Thompson,

30

我想添加另一个解决方案:就我而言,我需要在下拉按钮列表项中使用一个Enum组。因此它们可能有空间,即需要更多用户友好的描述:

  public enum CancelReasonsEnum
{
    [Description("In rush")]
    InRush,
    [Description("Need more coffee")]
    NeedMoreCoffee,
    [Description("Call me back in 5 minutes!")]
    In5Minutes
}

在帮助程序类(HelperMethods)中,我创建了以下方法:

 public static List<string> GetListOfDescription<T>() where T : struct
    {
        Type t = typeof(T);
        return !t.IsEnum ? null : Enum.GetValues(t).Cast<Enum>().Select(x => x.GetDescription()).ToList();
    }

呼叫此帮助程序时,您将获得项目描述列表。

 List<string> items = HelperMethods.GetListOfDescription<CancelReasonEnum>();

补充:无论如何,如果要实现此方法,则需要:GetDescription扩展来枚举。这就是我用的。

 public static string GetDescription(this Enum value)
    {
        Type type = value.GetType();
        string name = Enum.GetName(type, value);
        if (name != null)
        {
            FieldInfo field = type.GetField(name);
            if (field != null)
            {
                DescriptionAttribute attr =Attribute.GetCustomAttribute(field,typeof(DescriptionAttribute)) as DescriptionAttribute;
                if (attr != null)
                {
                    return attr.Description;
                }
            }
        }
        return null;
        /* how to use
            MyEnum x = MyEnum.NeedMoreCoffee;
            string description = x.GetDescription();
        */

    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.