从枚举中获取XmlEnumAttribute

时间:2013-09-11 09:50:43

标签: c# enums

我有枚举:

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;

可能存在更好的方法吗?

3 个答案:

答案 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#代码中,您只需点击后备代码即可。