迭代自定义枚举的属性

本文关键字:属性 枚举 自定义 迭代 | 更新日期: 2023-09-27 17:49:31

是否可以通过自定义枚举的属性进行迭代?

我的自定义enum看起来像这样:

public class Sex
{
    public static readonly Sex Female = new Sex("xx", "Female");
    public static readonly Sex Male = new Sex("xy", "Male");
    internal string Value { get; private set; }
    internal string Description { get; private set; }
    public override string ToString()
    {
        return Value.ToString();
    }
    public string GetDescription()
    {
        return this.Description;
    }
    protected Sex(string value, string description)
    {
        this.Value = value;
        this.Description = description;
    }

我使用它使enum能够用字符串"枚举",即:"xx"、"xy"…

我的问题是,是否有可能迭代所有性别,目标是用值和描述填充DropDownList ListItems。

var ddlSex = new DropDownList()
foreach(var sex in typeof(Sex).<some_magic>)
{
    ddlSex.Items.Add(new ListItem(sex.ToString(), sex.GetDescription()));
}
我的想法是用这个系统来解决这个问题。

迭代自定义枚举的属性

var list = typeof(Sex).GetFields(BindingFlags.Static | BindingFlags.Public)
            .Select(f => (Sex)f.GetValue(null))
            .ToList();
foreach(var sex in list)
{
    Console.WriteLine(sex.ToString() + ":" + sex.GetDescription());
}

当你使用反射时,你应该尝试一次完成它:通常在静态构造函数中。

这里,你可以这样做:

public class Sex
{
    public static readonly List<Sex> All = typeof(Sex).GetFields(BindingFlags.Public | BindingFlags.Static)
        .Where(f => f.FieldType == typeof(Sex))
        .Select(f => (Sex)f.GetValue(null))
        .ToList();
    public static readonly Sex Female = new Sex("xx", "Female");
    public static readonly Sex Male = new Sex("xy", "Male");
    ...
}

那么你可以只使用Sex.All,反射只会在你的运行时发生一次。您的调用看起来像这样:

foreach(var sex in Sex.All)
{
    this.ddlSex.Items.Add(new ListItem(sex.ToString(), sex.GetDescription()));
}