2010-01-07 15 views
7

Quiero exponer los atributos enum a la aplicación cliente WCF, pero solo puedo ver valores enum.Cómo exponer los atributos enum al cliente WCF

Aquí es la enumeración:

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 
} 

¿Cómo puedo exponer la Descripción y atributos de valor?

+0

No exponga enumeración en respuesta WCF debido a razones de compatibilidad hacia atrás. Ver http://stackoverflow.com/a/788281/52277 –

Respuesta

8

Puede exponer las enumeraciones de un servicio, pero los atributos de una enumeración no son serializados cuando se envían a través de la cable. Esto significa que los consumidores de esta enumeración solo verán la enumeración en sí y ninguno de sus atributos.

Lo que hay que hacer es vestir a su enumeración con un atributo DataContract y los valores con el atributo EnumMember para que su información será serializado, pero esto sólo se permitirá especificar la valor subyacente de cada valor de enumeración no una descripción

+0

Gracias por su respuesta, ¿hay alguna solución para exponer los atributos? – iniki

2

No estoy completamente al tanto de las especificaciones, pero dudo que este tipo de metadatos tenga una representación equivalente en WSDL. Por lo tanto, esto no será visible en el lado del cliente si genera los tipos en su proxy.

Sin embargo, si coloca todos sus DataContracts en un ensamblaje separado al que hace referencia en el cliente, puede reutilizar esos tipos en el lado del cliente. En ese caso, los atributos serían visibles. "Tipos de reutilización en ensambles a los que se hace referencia" debe verificarse para su referencia de servicio, pero esto está activado por defecto.

Here es una breve publicación del blog al respecto. Estoy seguro de que hay otros ...

+1

+1 exactamente - estos atributos son específicos de .NET - aquellos ** no ** viajarán de un servidor a otro a través de un canal de mensajes WCF. –

1

Ejemplo enumeración de los valores de un semáforo ...

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

    [EnumMember] 
    Green, 

    [EnumMember] 
    Amber 
} 
+0

De EnumMember ¿cómo consigo la descripción o los valores? –

3

Hay una solución si la intención es exponer un texto de visualización para los miembros de enumeración, definir su enumeración de esta manera en los contratos:

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

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

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

La serialización SvcUtils produce un resultado interesante:

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 
} 

Puede leer el Valor EnumMemberAttribute por reflexión y ahí lo tiene. También el archivo xsd metadatos producido por la serialización svcutil es el esperado:

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

Cuestiones relacionadas