从枚举中获取XmlEnumAttribute

我有枚举:

public enum Operation { ///  [System.Xml.Serialization.XmlEnumAttribute("01")] Item01, ///  [System.Xml.Serialization.XmlEnumAttribute("02")] Item02, ///  [System.Xml.Serialization.XmlEnumAttribute("03")] Item03, ///  [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; 

可能存在更好的方法吗?

您可以使用此扩展方法创建一个辅助(静态)类

 public static string GetXmlEnumAttributeValueFromEnum(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().FirstOrDefault(); if (attribute == null) return null;//or string.Empty, or throw exception return attribute.Name; } 

用法

 var res = Operation.Item1; var result = res.GetXmlAttributeValueFromEnum(); 

您必须使用Reflection来获取属性值:

 var value = Operation.Item02; var attributeValue = ((XmlEnumAttribute)typeof(Operation) .GetMember(value.ToString())[0] .GetCustomAttributes(typeof(XmlEnumAttribute), false)[0]) .Name; 

谢谢; 这对我很有用。 我想将拉斐尔的答案扩展到更为一般的情况。 如果枚举代码是由xsd.exe从xsd生成的,则并非每个枚举都具有该属性。 当您使用xsd枚举将字符串限制为特定的值列表时,可能会发生这种情况,其中一些值包含空格,而另一些则没有。 例如:

        

将发出C#序列化代码:

 public enum fooEnum { ///  [System.Xml.Serialization.XmlEnumAttribute("Foo Bar")] FooBar, ///  [System.Xml.Serialization.XmlEnumAttribute("Bar Foo")] BarFoo, ///  JustPlainFoo, } 

对于这种情况,期望“JustPlainFoo”的客户端代码将失败。 拉斐尔的答案如下:

 public static string XmlEnumToString(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().FirstOrDefault(); if (attribute == null) return member.Name; // Fallback to the member name when there's no attribute return attribute.Name; } 

最后,我会注意到Rauhotz的意见不适用于此案; XmlEnumAttribute将不会出现在生成的C#代码中,您只需点击后备代码即可。