从枚举填充列表
本文关键字:列表 填充 枚举 | 更新日期: 2023-09-27 18:31:56
我想填充一个同时提供枚举值和描述的列表。如何在 C# 中执行此操作?
我知道如何创建值列表,但我也想包含描述。这是我的枚举的样子:
using System.ComponentModel;
public enum BusinessCategory
{
[Description("Computers & Internet")]
ComputersInternet = 1,
[Description("Finance & Banking")]
FinanceBanking = 2,
[Description("Healthcare")]
Healthcare = 3,
[Description("Manufacturing")]
Manufacturing = 4
}
我希望我的列表看起来像:
[
{ 1, "Computers & Internet" },
{ 2, "Finance & Banking" },
{ 3, "Healthcare" },
{ 4, "Manufacturing" }
]
您将通过调用 Enum.GetValues(typeof(BusinessCategory))
来循环访问列表。
之后,您可以检索每个值的说明,如下所示:
- 如何从值中获取 C# 枚举描述?
首先,您需要通过调用获取业务类别的所有可能值 Enum.GetValues(typeof(BusinessCategory)).Cast<BusinessCategory>();
需要获取描述属性值后,应使用反射。这是代码(您可以 https://dotnetfiddle.net/cHgeAN 运行它):
using System;
using System.ComponentModel;
using System.Reflection;
using System.Linq;
public enum BusinessCategory
{
[Description("Computers & Internet")]
ComputersInternet = 1,
[Description("Finance & Banking")]
FinanceBanking = 2,
[Description("Healthcare")]
Healthcare = 3,
[Description("Manufacturing")]
Manufacturing = 4
}
public class Program
{
public static void Main()
{
// Get all possible values
var values = Enum.GetValues(typeof(BusinessCategory)).Cast<BusinessCategory>();
foreach(var v in values)
{
// Write to the console info about each value
Console.WriteLine("{0}[{1}] => {2}", v, (int)v, v.GetEnumDescription());
}
}
}
public static class EnumExtensions
{
public static string GetEnumDescription(this Enum value, string defaultValue = null)
{
return value.GetEnumAttribute<DescriptionAttribute>(a => a.Description, defaultValue);
}
private static string GetEnumAttribute<TAttr>(this Enum value, Func<TAttr, string> expr, string defaultValue = null)where TAttr : Attribute
{
FieldInfo fi = value.GetType().GetField(value.ToString());
var attributes = fi.GetCustomAttributes<TAttr>(false).ToArray();
return (attributes != null && attributes.Length > 0) ? expr(attributes.First()) : (defaultValue ?? value.ToString());
}
}
您可以使用反射和 LINQ 执行以下操作:
var enums = typeof(BusinessCategory).GetFields().Skip(1)
.Select(x => Tuple.Create((BusinessCategory)x.GetValue(null),
x.GetCustomAttributes<DescriptionAttribute>().First().Description));
这将返回将枚举映射到其描述属性的元组集合。
我不得不跳过第一个元素,因为我找不到不会从枚举返回隐藏 int 字段value__
的BindingFlags
配置——任何想法都会很棒!