我有两个枚举,一个带有标志,另一个没有:
[Flags]
public enum MyEnumWithFlags {
[Description("Item 1")]
Item1 = 1,
[Description("Item 2")]
Item2 = 2,
[Description("Item 3")]
Item3 = 4,
}
public enum MyEnum {
[Description("Item 1")]
Item1,
[Description("Item 2")]
Item2,
[Description("Item 3")]
Item3,
}
获取我尝试过的属性:
var a = MyEnumWithFlags.Item1 | MyEnumWithFlags.Item3;
var b = a.GetAttributes<DescriptionAttribute>();
这很好用。变量b必须属性:“第1项”和“第2项”。
然后我尝试了没有旗帜的Myenum:
var c = MyEnum.Item1;
var d = c.GetAttributes<DescriptionAttribute>();
在这种情况下,变量d具有所有枚举属性。不仅是Item1。
有谁知道可能出错了什么? GetAttributes扩展名为:
public static List<T> GetAttributes<T>(this Enum value) where T : Attribute {
List<T> attributes = new List<T>();
IEnumerable<Enum> flags = Enum.GetValues(value.GetType()).Cast<Enum>().Where(value.HasFlag);
if (flags != null) {
foreach (Enum flag in flags) {
MemberInfo info = flag.GetType().GetMember(flag.ToString()).FirstOrDefault();
if (info != null)
attributes.Add((T)info.GetCustomAttributes(typeof(T), false).FirstOrDefault());
}
return attributes;
}
return null;
}
更新
通过检查枚举是否为类型标志,我最终得到以下内容:
public static List<T> GetAttributes<T>(this Enum value) where T : Attribute {
Type type = value.GetType();
if (type.GetCustomAttributes<FlagsAttribute>().Any()) {
List<T> attributes = new List<T>();
IEnumerable<Enum> flags = Enum.GetValues(type).Cast<Enum>().Where(value.HasFlag);
if (flags != null) {
foreach (Enum flag in flags) {
MemberInfo info = flag.GetType().GetMember(flag.ToString()).FirstOrDefault();
if (info != null)
attributes.Add((T)info.GetCustomAttributes(typeof(T), false).FirstOrDefault());
}
return attributes;
}
} else {
MemberInfo info = type.GetMember(value.ToString()).FirstOrDefault();
if (info != null)
return new List<T> { (T)info.GetCustomAttributes(typeof(T), false).FirstOrDefault() };
}
return null;
} // GetAttributes
现在似乎可以使用Flags Enums和No Flags Enums。
有人认为这段代码可以改进吗?
谢谢