2010-01-07 132 views
7

我想將枚舉屬性暴露給WCF客戶端應用程序,但我只能看到枚舉值。如何將枚舉屬性暴露給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 
} 

我怎麼能揭露說明和值屬性?

+0

不要在由於向後兼容性的原因WCF響應暴露枚舉。請參閱http://stackoverflow.com/a/788281/52277 –

回答

8

可以公開從服務枚舉加強枚舉,但是當他們在發送上枚舉的屬性不序列化線。這意味着這個枚舉的消費者只會看到枚舉本身而不是你的屬性。

你需要做的是裝扮你枚舉了DataContract屬性,並與EnumMember屬性的值,使您的信息將被序列化,但這隻會讓你指定每個枚舉值的潛在價值 ,而不是描述。

+0

感謝您的回覆,是否有任何解決方法來揭露這些屬性? – iniki

2

我不完全熟悉規範,但我懷疑這種元數據在WSDL中具有等同的表示形式。因此,如果您在代理中生成這些類型,則這在客戶端不可見。

但是,如果您將所有DataContracts放入您在客戶端引用的單獨程序集中,則可以在客戶端重新使用這些類型。在這種情況下,屬性將是可見的。 「引用程序集中的重用類型」需要針對您的服務引用進行檢查,但默認情況下處於啓用狀態。

Here是一篇關於它的簡短博客文章。我敢肯定還有其他的...

+1

正好 - 這些屬性是.NET特定的 - 這些**不會**通過WCF消息傳遞通道從服務器傳輸到客戶端。 –

1

示例枚舉了紅綠燈的價值觀......

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

    [EnumMember] 
    Green, 

    [EnumMember] 
    Amber 
} 
+0

從EnumMember我如何得到描述或值? –

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>