如何将枚举属性公开给WCF客户端

时间:2010-01-07 13:32:27

标签: wcf enums

我想将枚举属性公开给WCF客户端应用程序,但我只能看到枚举值。

这是枚举:

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 个答案:

答案 0 :(得分:8)

您可以从服务公开枚举,但枚举时的属性在通过网络发送时不会被序列化。这意味着此枚举的使用者只会看到枚举本身,而不会看到任何属性。

您需要做的是使用DataContract属性打造枚举,并使用EnumMember属性打造值,以便将序列化您的信息,但这只允许您指定< em>每个枚举值的基础值,而不是描述。

答案 1 :(得分:3)

如果打算为枚举成员公开显示文本,在合同中以这种方式定义枚举,则有一种解决方法:

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值,并获得它。 svcutil序列化生成的xsd元数据文件也是预期的:

<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 :(得分:2)

我并不完全熟悉规范,但我怀疑这种元数据在WSDL中具有等效表示。因此,如果您在代理中生成类型,则在客户端不会显示此内容。

但是,如果将所有DataContracts放在客户端中引用的单独程序集中,则可以在客户端重用这些类型。在这种情况下,属性将是可见的。需要检查“引用程序集中的重用类型”以查找“服务引用”,但默认情况下会启用此选项。

Here是一篇关于它的简短博文。我确定还有其他人......

答案 3 :(得分:1)

红绿灯值的示例枚举...

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

    [EnumMember]
    Green,

    [EnumMember]
    Amber
}