我有枚举:
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,
}
Run Code Online (Sandbox Code Playgroud)
我如何获得XmlEnumAttribute值?
我正在努力:
var res = Operation.Item1;
var result = (res.GetType().GetField("Item01").GetCustomAttributes(typeof(XmlEnumAttribute), true)[0] as XmlEnumAttribute).Name;
Run Code Online (Sandbox Code Playgroud)
可能存在更好的方法吗?
Rap*_*aus 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;
}
Run Code Online (Sandbox Code Playgroud)
用法
var res = Operation.Item1;
var result = res.GetXmlAttributeValueFromEnum();
Run Code Online (Sandbox Code Playgroud)
您必须使用Reflection来获取属性值:
var value = Operation.Item02;
var attributeValue = ((XmlEnumAttribute)typeof(Operation)
.GetMember(value.ToString())[0]
.GetCustomAttributes(typeof(XmlEnumAttribute), false)[0])
.Name;
Run Code Online (Sandbox Code Playgroud)
谢谢; 这对我有用。我想将拉斐尔的答案扩展到一个稍微更一般的场景。如果枚举代码是由 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>
Run Code Online (Sandbox Code Playgroud)
将发出 C# 序列化代码:
public enum fooEnum {
/// <remarks/>
[System.Xml.Serialization.XmlEnumAttribute("Foo Bar")]
FooBar,
/// <remarks/>
[System.Xml.Serialization.XmlEnumAttribute("Bar Foo")]
BarFoo,
/// <remarks/>
JustPlainFoo,
}
Run Code Online (Sandbox Code Playgroud)
对于这种情况,期望“JustPlainFoo”的客户端代码将会失败。我对拉斐尔答案的版本如下:
public static string XmlEnumToString<TEnum>(this 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;
}
Run Code Online (Sandbox Code Playgroud)
最后,我要指出的是,劳霍茨的评论不适用于本案;XmlEnumAttribute 不会出现在生成的 C# 代码中,您只需点击后备代码即可。