迭代自定义枚举的属性
本文关键字:属性 枚举 自定义 迭代 | 更新日期: 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()));
}