[英]C# Switch on enums
我有一个枚举:
public enum Status
{
Incomplete = 1, Complete = 2, Cancelled = 3, Deleted = 4
}
现在在某个页面上,我希望在复选框列表中列出此枚举。 这很好,除了我希望每个复选框的文本显示不同于枚举的文本。
即复选框应说:
“未处理”而不是“不完整”
“已处理”而非“完成”
“无效”而不是“取消”
是否可以将此枚举放在foreach中,然后打开状态并更新文本。 像这样:
var statuses = Enum.GetNames(typeof(Status));
foreach (var status in statuses)))
{
switch (status)
{
case Status.Complete.ToString():
status = "Processed";
break; ...etc
}
}
任何想法将不胜感激。
C#具有直接解决您问题的语言功能。 这是一篇文章 ,为您提供完整的详细信息。
简短版本:将扩展属性值应用于每个值:
enum OrderStatus
{
[EnumValueData(Name="New Order")]
NewOrder = 1,
[EnumValueData(Name="In Process")]
Processing = 2,
[EnumValueData(Name="Shipped")]
Shipped = 3
}
然后将所述值应用于您的单选按钮,列表框或其他内容:
public static Dictionary<int, string> GetListItems(Type enumType)
{
if (!enumType.IsEnum)
throw new ApplicationException("GetListItems does not support non-enum types");
Dictionary<int, string> list = new Dictionary<int, string>();
foreach(FieldInfo field in enumType.GetFields(BindingFlags.Static | BindingFlags.GetField | BindingFlags.Public))
{
int value;
string display;
value = (int)field.GetValue(null);
display = Enum.GetName(enumType, value);
foreach(Attribute currAttr in field.GetCustomAttributes(true))
{
EnumValueDataAttribute valueAttribute = currAttr as EnumValueDataAttribute;
if (valueAttribute != null)
display = valueAttribute.Name;
}
list.Add(value, display);
}
return list;
}
您可以使用System.ComponentModel类中的Description属性为每个枚举值分配文本描述。 然后,您可以通过遍历枚举并获取每个的Description属性而不是使用开关来设置text属性。
public enum Status
{
[Description("Not Processed")] Incomplete = 1,
[Description("Processed")] Complete = 2,
[Description("Void")] Cancelled = 3,
Deleted = 4
}
然后,您可以使用类似下面的内容来获取单个枚举值的描述(或修改它以返回Bob在其示例中显示的Dictionary):
public static string GetEnumDescription ( Object value )
{
try
{
Type objType = value.GetType();
FieldInfo fldInf = objType.GetField( Enum.GetName( objType, value ) );
Object[ ] attributes = fldInf.GetCustomAttributes( false );
if ( attributes.Length > 0 )
{
DescriptionAttribute descAttr = ( DescriptionAttribute )attributes[ 0 ];
return descAttr.Description;
}
else
{
return value.ToString();
}
}
catch
{
return string.Empty;
}
}
您可以将修改字符串放在一个数组中,然后使用枚举索引来访问数组元素。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.