我有枚举:
public enum Operation {
/// <remarks/>
[System.Xml.Serialization.XmlEnumAttribute("01")]
Item01,
/// <remarks/>
[System.Xml.Serialization.XmlEnumAttribute("02")]
Item02,
/// <remarks/>
[System.Xml.Serialization.XmlEnumAttribute("03")]
Item03,
/// <remarks/>
[System.Xml.Serialization.XmlEnumAttribute("04")]
Item04,
}
我如何获得XmlEnumAttribute值?
我正在尝试:
var res = Operation.Item1;
var result = (res.GetType().GetField("Item01").GetCustomAttributes(typeof(XmlEnumAttribute), true)[0] as XmlEnumAttribute).Name;
可能存在更好的方法吗?
答案 0 :(得分:20)
您可以使用此扩展方法
创建一个辅助(静态)类public static string GetXmlEnumAttributeValueFromEnum<TEnum>(this TEnum value) where TEnum : struct, IConvertible
{
var enumType = typeof(TEnum);
if (!enumType.IsEnum) return null;//or string.Empty, or throw exception
var member = enumType.GetMember(value.ToString()).FirstOrDefault();
if (member == null) return null;//or string.Empty, or throw exception
var attribute = member.GetCustomAttributes(false).OfType<XmlEnumAttribute>().FirstOrDefault();
if (attribute == null) return null;//or string.Empty, or throw exception
return attribute.Name;
}
使用
var res = Operation.Item1;
var result = res.GetXmlAttributeValueFromEnum();
答案 1 :(得分:7)
您必须使用Reflection来获取属性值:
var value = Operation.Item02;
var attributeValue = ((XmlEnumAttribute)typeof(Operation)
.GetMember(value.ToString())[0]
.GetCustomAttributes(typeof(XmlEnumAttribute), false)[0])
.Name;
答案 2 :(得分:3)
感谢;这对我很有用。我想将拉斐尔的答案扩展到更为一般的情况。如果枚举代码是由xsd.exe从xsd生成的,则不是每个枚举都具有该属性。当您使用xsd枚举将字符串限制为特定的值列表时,可能会发生这种情况,其中一些值具有空格,而其中一些值不存在。例如:
<xs:simpleType name="fooEnum">
<xs:restriction base="xs:string">
<xs:enumeration value="Foo Bar" />
<xs:enumeration value="Bar Foo" />
<xs:enumeration value="JustPlainFoo" />
</xs:restriction>
</xs:simpleType>
将发出C#序列化代码:
public enum fooEnum {
/// <remarks/>
[System.Xml.Serialization.XmlEnumAttribute("Foo Bar")]
FooBar,
/// <remarks/>
[System.Xml.Serialization.XmlEnumAttribute("Bar Foo")]
BarFoo,
/// <remarks/>
JustPlainFoo,
}
对于这种情况,客户端代码期待&#34; JustPlainFoo&#34;将失败。我的拉斐尔答案的答案如下:
public static string XmlEnumToString<TEnum>(TEnum value) where TEnum : struct, IConvertible
{
Type enumType = typeof(TEnum);
if (!enumType.IsEnum)
return null;
MemberInfo member = enumType.GetMember(value.ToString()).FirstOrDefault();
if (member == null)
return null;
XmlEnumAttribute attribute = member.GetCustomAttributes(false).OfType<XmlEnumAttribute>().FirstOrDefault();
if (attribute == null)
return member.Name; // Fallback to the member name when there's no attribute
return attribute.Name;
}
最后,我要注意到Rauhotz的作品不适用于此案; XmlEnumAttribute不会出现在生成的C#代码中,您只需点击后备代码即可。