从枚举C#获取显示名称列表

问题描述

我正在尝试获取给定枚举的显示名称的列表。如果枚举值具有显示名称,则它应该在列表中,如果没有,则名称应该在列表中。因此,如果我有一个像这样的枚举:

 public enum SourceFromEnum
        {
            Youtube,Reddit,Instagram,Facebook,Twitter,[display(Name = "News Website")]
            NewsSite,[display(Name = "Phone or Computer")]
            Device,}

我的函数生成的列表应该与以下内容相同:

  List<string> enumdisplayNames = new List<string>()
            {
            "Youtube","Reddit","Instagram","Facebook","Twitter","News Website","Phone or Computer"
            };

我看过this post,但据我所知,这些问题或者没有提供列表,或者对于我想做的事情过于复杂。

解决方法

快速编写一种方法,您可以从那里展开。

要使用

SourceFromEnum test = new SourceFromEnum();
    
    var me =GetDisplayNames(test);

方法

public  List<string> GetDisplayNames(Enum enm)
{
    var type=enm.GetType();
    var displaynames = new List<string>();
    var names = Enum.GetNames(type);
    foreach (var name in names)
    {
        var field = type.GetField(name);
        var fds = field.GetCustomAttributes(typeof(DisplayAttribute),true);
        
        if (fds.Length==0)
        {
            displaynames.Add(name);
        }
        
        foreach (DisplayAttribute fd in fds)
        {
            displaynames.Add(fd.Name);
        }
    }
    return displaynames;
}

可以将其设置为静态,进行错误检查等。

,

我只是这样写了一个:

static List<String> ParseEnums(Type enumType)
{
    if (!enumType.IsEnum || string.IsNullOrEmpty(enumType.FullName))
        return null;

    var ret = new List<string>();
    foreach (var val in Enum.GetValues(enumType))
    {
        var definition = Enum.GetName(enumType,val);
        if (string.IsNullOrEmpty(definition))
            continue;

        // can't use (int)val 
        var code = Convert.ToInt32(val);
        var description = GetDescription(enumType,definition);

        ret.Add(description);
    }

    return ret;
}

static string GetDescription(Type enumType,string field)
{
    FieldInfo fieldInfo = enumType.GetField(field);
    if (fieldInfo == null)
        return string.Empty;

    foreach (var attribute in fieldInfo.GetCustomAttributes())
    {
        if (attribute == null)
            continue;
        if (attribute is DescriptionAttribute descAtt)
            return descAtt.Description;
        else if (attribute.ToString().IndexOf("Display",StringComparison.Ordinal) > 0)
        {
            var prop = attribute.GetType().GetProperty("Name");
            if (prop == null)
                continue;
            return Convert.ToString(prop.GetValue(attribute));
        }
    }

    return null;
}