我有以下ENUM:
[Flags]
public enum DataFiat {
[Description("Público")]
Public = 1,
[Description("Filiado")]
Listed = 2,
[Description("Cliente")]
Client = 4
} // DataFiat
Run Code Online (Sandbox Code Playgroud)
我创建了一个扩展来获取Enum属性:
public static T GetAttribute<T>(this Enum value) where T : Attribute {
T attribute;
MemberInfo info = value.GetType().GetMember(value.ToString()).FirstOrDefault();
if (info != null) {
attribute = (T)info.GetCustomAttributes(typeof(T), false).FirstOrDefault();
return attribute;
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
这适用于非Flags Enums ...但是当我有:
var x = DataFiat.Public | DataFiat.Listed;
var y = x.GetAttribute<Description>();
Run Code Online (Sandbox Code Playgroud)
y的值为null ...
我想得到"Público,Filiado,Cliente"......就像ToString()一样.
如何更改我的扩展程序才能使其正常工作?
谢谢
你可以使用这个:
var values = x.ToString()
.Split(new[] { ", " }, StringSplitOptions.None)
.Select(v => (DataFiat)Enum.Parse(typeof(DataFiat), v));
Run Code Online (Sandbox Code Playgroud)
从而获得个体的价值。然后获取它们的属性值。
像这样的东西:
var y2 = values.GetAttributes<DescriptionAttribute, DataFiat>();
public static T[] GetAttributes<T, T2>(this IEnumerable<T2> values) where T : Attribute
{
List<T> ts =new List<T>();
foreach (T2 value in values)
{
T attribute;
MemberInfo info = value.GetType().GetMember(value.ToString()).FirstOrDefault();
if (info != null)
{
attribute = (T)info.GetCustomAttributes(typeof(T), false).FirstOrDefault();
ts.Add(attribute);
}
}
return ts.ToArray();
}
Run Code Online (Sandbox Code Playgroud)