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

如何向WCF客户端公开枚举属性,wcf,enums,Wcf,Enums,我想向WCF客户端应用程序公开枚举属性,但我只能看到枚举值 以下是枚举: public enum TemplateType { [EnumDescription("Property Particulars")] [EnumValue("PropertyParticulars")] PropertyParticulars = 1, [EnumDescription("Short Format Lists")] [EnumValue("Sho

我想向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
}

如何公开描述和值属性?

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


你需要做的是用一个
DataContract
属性修饰你的枚举,并用该属性修饰你的值,这样你的信息就会被序列化,但这只允许你指定每个枚举值的基础值,而不是描述。

我不完全熟悉这些规范,但我怀疑这种元数据在WSDL中是否具有等效的表示形式。因此,如果在代理中生成类型,则这在客户端将不可见

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


这是一篇关于它的短文。我肯定还有其他…

交通灯值的示例枚举

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

    [EnumMember]
    Green,

    [EnumMember]
    Amber
}

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

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>


感谢您的回复,是否有办法公开属性?+1确切地说,这些属性是.NET特定的-这些属性不会通过WCF消息通道从服务器传输到客户端。由于向后兼容的原因,请勿在WCF响应中公开枚举。​请参见EnumMember如何获取描述或值?