从枚举 C# 中获取显示名称列表
Get list of display names from enum 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;
}
我正在尝试获取给定枚举的显示名称列表。如果枚举值有显示名称,它应该在列表中,如果没有,默认名称应该在列表中。所以如果我有一个像这样的枚举:
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;
}