Get enum from enum attribute
我已经得到
1 2 3 4 5 6 7 | public enum Als { [StringValue("Beantwoord")] Beantwoord = 0, [StringValue("Niet beantwoord")] NietBeantwoord = 1, [StringValue("Geselecteerd")] Geselecteerd = 2, [StringValue("Niet geselecteerd")] NietGeselecteerd = 3, } |
具有
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public class StringValueAttribute : Attribute { private string _value; public StringValueAttribute(string value) { _value = value; } public string Value { get { return _value; } } } |
我想把我从一个组合框中选择的项的值放入一个int中:
1 |
这可能吗?如果可能,怎么可能?(
下面是一个帮助器方法,它应该为您指明正确的方向。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | protected Als GetEnumByStringValueAttribute(string value) { Type enumType = typeof(Als); foreach (Enum val in Enum.GetValues(enumType)) { FieldInfo fi = enumType.GetField(val.ToString()); StringValueAttribute[] attributes = (StringValueAttribute[])fi.GetCustomAttributes( typeof(StringValueAttribute), false); StringValueAttribute attr = attributes[0]; if (attr.Value == value) { return (Als)val; } } throw new ArgumentException("The value '" + value +"' is not supported."); } |
要调用它,只需执行以下操作:
1 | Als result = this.GetEnumByStringValueAttribute<Als>(ComboBox.SelectedValue); |
虽然这可能不是最好的解决方案,因为它与
我正在使用Microsoft的DescriptionAttribute和以下扩展方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | public static string GetDescription(this Enum value) { if (value == null) { throw new ArgumentNullException("value"); } string description = value.ToString(); FieldInfo fieldInfo = value.GetType().GetField(description); DescriptionAttribute[] attributes = (DescriptionAttribute[]) fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false); if (attributes != null && attributes.Length > 0) { description = attributes[0].Description; } return description; } |
这里有几个扩展方法,我正是为了这个目的而使用的,我已经重写了这些方法来使用您的
1 2 3 4 5 6 7 8 9 10 11 | public static T FromEnumStringValue<T>(this string description) where T : struct { Debug.Assert(typeof(T).IsEnum); return (T)typeof(T) .GetFields() .First(f => f.GetCustomAttributes(typeof(StringValueAttribute), false) .Cast<StringValueAttribute>() .Any(a => a.Value.Equals(description, StringComparison.OrdinalIgnoreCase)) ) .GetValue(null); } |
这可以在.NET 4.5中稍微简单一点:
1 2 3 4 5 6 7 8 9 10 | public static T FromEnumStringValue<T>(this string description) where T : struct { Debug.Assert(typeof(T).IsEnum); return (T)typeof(T) .GetFields() .First(f => f.GetCustomAttributes<StringValueAttribute>() .Any(a => a.Value.Equals(description, StringComparison.OrdinalIgnoreCase)) ) .GetValue(null); } |
要调用它,只需执行以下操作:
1 | Als result = ComboBox.SelectedValue.FromEnumStringValue<Als>(); |
相反,这里有一个从枚举值中获取字符串的函数:
1 2 3 4 5 6 7 8 | public static string StringValue(this Enum enumItem) { return enumItem .GetType() .GetField(enumItem.ToString()) .GetCustomAttributes<StringValueAttribute>() .Select(a => a.Value) .FirstOrDefault() ?? enumItem.ToString(); } |
并称之为:
1 | string description = Als.NietBeantwoord.StringValue() |
从这个高度乐观的问题和答案的重复链接来看,这里有一个方法可以与C 7.3的新
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public static TEnum? GetEnumFromDescription<TEnum>(string description) where TEnum : struct, Enum { var comparison = StringComparison.OrdinalIgnoreCase; foreach (var field in typeof(TEnum).GetFields()) { var attribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute; if (attribute != null) { if (string.Compare(attribute.Description, description, comparison) == 0) return (TEnum)field.GetValue(null); } if (string.Compare(field.Name, description, comparison) == 0) return (TEnum)field.GetValue(null); } return null; } |
不知道我是否在这里遗漏了什么,你能不能不这样做?
1 2 | Als temp = (Als)combo1.SelectedItem; int t = (int)temp; |
要基于应用于枚举成员的属性值分析字符串值,我建议您使用我的enums.net开放源代码库。
对于像
注册并存储用于
1 | Format = Enums.RegisterCustomEnumFormat(m => m.Attributes.Get<StringValueAttribute>()?.Value); |
然后使用自定义
1 | Als result = Enums.Parse<Als>("Niet beantwoord", Format); // result == Als.NietBeantwoord |
如果您使用的是诸如
1 | Als result = Enums.Parse<Als>("Niet beantwoord", EnumFormat.Description); |
如果您感兴趣,这是获取与枚举值关联的字符串值的方法。
1 | string value = Als.NietBeantwoord.AsString(Format); // value =="Niet beantwoord" |