Thanks; это полезно для меня. Я хотел бы расширить ответ Рафаэля на несколько более общий сценарий. Если код перечисления генерируется из xsd с помощью xsd.exe, не каждый атрибут будет иметь атрибут. Это может произойти, если вы используете xsd enums для ограничения строк определенным списком значений, некоторые из которых имеют пробелы, а некоторые из них - нет. Например:
<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,
}
В этом случае, код клиента ожидает "JustPlainFoo" потерпит неудачу. Моя версия ответа Рафаэля тогда следующим образом:
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;
}
Наконец, отмечу, что commment Rauhotz не будет применяться к этому случаю; XmlEnumAttribute не будет присутствовать в сгенерированном коде C#, и вы просто ударите резервный код.
Благодаря всем членам – zrabzdn