Я надеюсь возвращать следующий класс через веб-сервис, который включает перечислимый тип как одного из его участников.
[Serializable, XmlRoot("GeoCoordinate")]
public class GeoCoordinate
{
public enum AccuracyLevel
{
Unknown = 0,
Country = 1,
Region = 2,
SubRegion = 3,
Town = 4,
PostalCode = 5,
Street = 6,
Intersection = 7,
Address = 8,
Premise = 9
}
private AccuracyLevel _accuracy;
// ... more members
public AccuracyLevel Accuracy
{
get { return _accuracy; }
set { _accuracy = value;}
}
}
Это работает правильно, но возвратит результат в форме:
<!-- ... -->
<Accuracy>Unknown or Country or Region or SubRegion or Town or
PostalCode or Street or Intersection or Address or Premise</Accuracy>
<!-- ... -->
Вместо строки, которая представляет перечисление, я хотел бы, чтобы оно просто возвратило целое число. Может это быть сделанным, не изменяя тип GeoCoordinate.Accuracy
?
Хотя это взлом, я счел, что использование XmlEnumAttribute
на каждом из членов перечисления является наиболее паллиативным в данном случае. Если бы это перечисление было намного больше, то, вероятно, было бы лучше использовать XmlIgnore
на свойстве Accuracy, и добавить дополнительное свойство int к классу, как описано в другом ответе на этот вопрос.
Использование XmlEnumAttribute
означает, что нужно изменить только само перечисление, и xml будет сериализоваться как int, где бы оно ни использовалось.
public enum AccuracyLevel
{
[XmlEnum("0")] Unknown = 0,
[XmlEnum("1")] Country = 1,
[XmlEnum("2")] Region = 2,
[XmlEnum("3")] SubRegion = 3,
[XmlEnum("4")] Town = 4,
[XmlEnum("5")] PostalCode = 5,
[XmlEnum("6")] Street = 6,
[XmlEnum("7")] Intersection = 7,
[XmlEnum("8")] Address = 8,
[XmlEnum("9")] Premise = 9
}
Что вам больше всего нужно:
Как правило, я считаю, что вам не нужно применять (1). Для меня проверяемость (2) гораздо важнее. Что лучше всего подходит для вашей ситуации?
-121--2959435-No. Правильная структура проектов. Попробуйте использовать какой-то порядок, основанный на абстракции - от низкого уровня до высокого уровня.
-121--1369898- Украсить перечисление с помощью [Сериализуемый]
или [DataContract]
. Есть некоторые различия между двумя атрибутами, убедитесь, что вы взяли его на изменение ( эта запись блога может помочь с этим). И отметьте отдельный изделия перечисления [EnumMember]
. Я никогда не проверял, как выглядит перечисление при транзите, но это гарантирует, что оно прибудет на другой конец, а также гарантирует, что его заберут, если вы создадите прокси на стороне клиента.
Я считаю, что вам нужно использовать [XmlIgnore]
в перечислении и создайте второе свойство, которое возвращает целочисленное значение:
[XmlRoot("GeoCoordinate")]
public class GeoCoordinate
{
public enum AccuracyLevel
{
Unknown = 0,
Country = 1,
Region = 2,
SubRegion = 3,
Town = 4,
PostalCode = 5,
Street = 6,
Intersection = 7,
Address = 8,
Premise = 9
}
private AccuracyLevel _accuracy;
// ... more members
[XmlIgnore]
public AccuracyLevel Accuracy
{
get { return _accuracy; }
set { _accuracy = value;}
}
[XmlElement("AccuracyLevel")]
public int AccuracyLevelInt
{
get {return (int) AccuracyLevel;}
set {AccuracyLevel = (AccuracyLevel) value;}
}
}
Обратите внимание, что [Serializable]
не используется сериализатором XML.
Также обратите внимание, что свойство AccuracyLevelInt
, вероятно, реализовано неправильно. Я сейчас занимаюсь этим.