从枚举中获取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#代码中,您只需点击后备代码即可。
上述就是C#学习教程:从枚举中获取XmlEnumAttribute分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1003956.html