2010-01-07 6 views
7

Je souhaite exposer les attributs enum à l'application cliente WCF, mais je ne peux voir que les valeurs enum.Comment exposer les attributs enum au client WCF

Voici le 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 
} 

Comment puis-je exposer la description et les attributs de valeur?

+0

Ne pas exposer ENUM en réponse WCF pour des raisons de compatibilité descendante. Voir http://stackoverflow.com/a/788281/52277 –

Répondre

8

Vous pouvez exposer énumérations d'un service, mais les attributs d'un ENUM ne sont pas sérialisé quand ils sont envoyés sur la câble. Cela signifie que les utilisateurs de cette énumération ne verront que l'énumération elle-même et aucun de vos attributs.

Ce que vous devez faire est d'habiller votre ENUM avec un attribut DataContract et les valeurs avec l'attribut EnumMember afin que vos informations seront sérialisé, mais cela ne vous permet de spécifier la valeur sous-jacente de chaque valeur ENUM , pas une description.

+0

Merci pour votre réponse, Y at-il un travail pour exposer les attributs? – iniki

2

Je ne suis pas complètement versé dans les spécifications, mais je doute que ce type de métadonnées ait une représentation équivalente dans WSDL. Ainsi, cela ne sera pas visible côté client si vous générez les types dans votre proxy. Toutefois, si vous placez tous vos DataContracts dans un assembly distinct que vous référencez dans le client, vous pouvez réutiliser ces types du côté client. Dans ce cas, les attributs seraient visibles. "Réutiliser les types dans les assemblys référencés" doit être vérifié pour votre référence de service, mais cela est activé par défaut.

Here C'est un petit article de blog à ce sujet. Je suis sûr qu'il ya d'autres ...

+1

+1 exactement - ces attributs sont spécifiques à .NET - ceux-ci ne voyageront pas ** d'un serveur à l'autre sur un canal de messagerie WCF. –

1

Exemple ENUM pour les valeurs d'un feu de circulation ...

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

    [EnumMember] 
    Green, 

    [EnumMember] 
    Amber 
} 
+0

From EnumMember Comment puis-je obtenir la description ou les valeurs? –

3

Il existe une solution si l'intention est d'exposer un texte d'affichage pour les membres de ENUM, définir votre ENUM de cette manière dans les contrats:

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

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

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

La sérialisation de SvcUtils produit un résultat intéressant:

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 
} 

Vous pouvez lire la valeur EnumMemberAttribute par réflexion et là vous l'avez. De plus, le fichier de métadonnées xsd produit par sérialisation est svcutil comme prévu:

<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> 

Questions connexes