【问题标题】:How to expose enum attributes to WCF client如何向 WCF 客户端公开枚举属性
【发布时间】:2010-01-07 13:32:26
【问题描述】:

我想向 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 属性?

【问题讨论】:

标签: wcf enums


【解决方案1】:

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

您需要做的是用DataContract 属性和EnumMember 属性修饰您的枚举,以便您的信息将被序列化,但这只会允许您指定基础值 每个枚举值,而不是描述。

【讨论】:

  • 感谢您的回复,有什么办法可以公开属性吗?
【解决方案2】:

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

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>

【讨论】:

    【解决方案3】:

    我并不完全精通规范,但我怀疑这种元数据在 WSDL 中是否具有等效表示。因此,如果您在代理中生成类型,这在客户端将不可见。

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

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

    【讨论】:

    • +1 完全正确 - 这些属性是 .NET 特定的 - 这些属性将不会通过 WCF 消息传递通道从服务器传送到客户端。
    【解决方案4】:

    交通灯值的示例枚举...

    [DataContract]
    public enum TrafficLightType
    {
        [EnumMember]
        Red,
    
        [EnumMember]
        Green,
    
        [EnumMember]
        Amber
    }
    

    【讨论】:

    • 如何从 EnumMember 获取描述或值?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多