Как выставить атрибуты enum клиенту WCF - PullRequest
7 голосов
/ 07 января 2010

Я хочу предоставить атрибуты enum клиентскому приложению WCF, но вижу только значения enum.

Вот перечисление:

public enum TemplateType
{
    [EnumDescription("Property Particulars")]
    [EnumValue("PropertyParticulars")]        
    PropertyParticulars = 1,

    [EnumDescription("Short Format Lists")]
    [EnumValue("ShortFormatLists")]        
    ShortFormatLists,

    [EnumDescription("Client Letters")]
    [EnumValue("ClientLetters")]
    ClientLetters,

    [EnumDescription("Labels")]
    [EnumValue("Labels")]
    Labels
}

Как открыть атрибуты Description и Value?

Ответы [ 4 ]

8 голосов
/ 07 января 2010

Вы можете выставить перечисления из службы, но атрибуты перечисления не сериализуются, когда они отправляются по проводам. Это означает, что потребители этого перечисления будут видеть только само перечисление и ни один из ваших атрибутов.

Что вам нужно сделать, так это одеть ваше перечисление с атрибутом DataContract и значения с атрибутом EnumMember, чтобы ваша информация была сериализована, но это позволит вам указать базовое значение каждого значения перечисления, а не описание.

3 голосов
/ 28 августа 2014

Существует обходной путь, если целью является предоставление отображаемого текста для членов перечисления, таким образом определите свое перечисление в договорах:

public enum EPaymentCycle
{
    [EnumMember(Value = "Month by Month")]
    Monthly,

    [EnumMember(Value = "Week by Week")]
    Weekly,

    [EnumMember(Value = "Hour by Hour")]
    Hours
}

Сериализация SvcUtils дает интересный результат:

public enum EPaymentCycle : int
{

    [System.Runtime.Serialization.EnumMemberAttribute(Value="Month by Month")]
    MonthByMonth= 0,

    [System.Runtime.Serialization.EnumMemberAttribute(Value="Week by Week")]
    WeekbyWeek= 1,

    [System.Runtime.Serialization.EnumMemberAttribute(Value="Hour by Hour")]
    HourbyHour = 2
}

Вы можете прочитать значение EnumMemberAttribute по отражению, и вот оно у вас. Также, как и ожидалось, файл метаданных xsd, созданный сериализацией svcutil:

<xs:simpleType name="EPaymentCycle">
<xs:restriction base="xs:string">
  <xs:enumeration value="Month by Month" />
  <xs:enumeration value="Week by Week" />
  <xs:enumeration value="Hour by Hour" />
</xs:restriction>

2 голосов
/ 07 января 2010

Я не совсем разбираюсь в спецификациях, но сомневаюсь, что метаданные такого типа имеют эквивалентное представление в WSDL. Таким образом, это не будет видно на стороне клиента, если вы создадите типы в прокси.

Однако, если вы поместите все свои DataContracts в отдельную сборку, на которую вы ссылаетесь в клиенте, вы можете повторно использовать эти типы на стороне клиента. В этом случае атрибуты будут видны. «Повторное использование типов в ссылочных сборках» необходимо проверить на наличие ссылки на сервис, но по умолчанию это включено.

Вот краткий пост в блоге . Я уверен, что есть другие ...

1 голос
/ 05 апреля 2012

Пример перечисления для значений светофора ...

[DataContract]
public enum TrafficLightType
{
    [EnumMember]
    Red,

    [EnumMember]
    Green,

    [EnumMember]
    Amber
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...