2010-01-07 27 views
7

Tôi muốn hiển thị các thuộc tính enum cho ứng dụng khách WCF, nhưng tôi chỉ có thể thấy các giá trị enum.Cách hiển thị các thuộc tính enum cho máy khách WCF

Đây là enum:

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 
} 

Làm thế nào tôi có thể tiếp xúc với các mô tả và tính giá trị gia tăng?

+0

Không để enum để đáp ứng WCF vì lý do tương thích ngược. Xem http://stackoverflow.com/a/788281/52277 –

Trả lời

8

Bạn có thể phơi bày sự đếm từ một dịch vụ nhưng các thuộc tính trên một enum không tuần tự khi chúng được gửi qua dây điện. Điều này có nghĩa rằng người tiêu dùng của enum này sẽ chỉ thấy enum chính nó và không có thuộc tính của bạn.

Những gì bạn cần làm là ăn mặc enum của bạn với một thuộc tính DataContract và các giá trị với thuộc tính EnumMember để thông tin của bạn sẽ được tuần tự, nhưng điều này sẽ chỉ cho phép bạn xác định giá trị cơ bản của mỗi giá trị enum , không phải mô tả.

+0

Cảm ơn bạn đã trả lời của bạn, Có bất kỳ công việc xung quanh để lộ các thuộc tính? – iniki

2

Tôi không hoàn toàn thông thạo các thông số kỹ thuật, nhưng tôi nghi ngờ loại siêu dữ liệu này có đại diện tương đương trong WSDL. Do đó, điều này sẽ không hiển thị ở phía máy khách nếu bạn tạo các loại trong proxy của mình.

Tuy nhiên, nếu bạn đặt tất cả DataContracts của mình trong một hội đồng riêng biệt mà bạn tham chiếu trong ứng dụng khách, bạn có thể sử dụng lại các loại đó ở phía máy khách. Trong trường hợp đó, các thuộc tính sẽ được hiển thị. "Việc sử dụng lại các loại trong hội đồng được tham chiếu" cần được kiểm tra cho Tham chiếu dịch vụ của bạn, nhưng điều này được bật theo mặc định.

Here là một bài đăng trên blog ngắn về nó. Tôi chắc rằng có những người khác ...

+1

+1 chính xác - các thuộc tính này là .NET cụ thể - những thuộc tính này sẽ ** không ** đi qua từ máy chủ đến máy khách qua kênh nhắn tin WCF. –

1

Ví dụ enum cho các giá trị của một đèn giao thông ...

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

    [EnumMember] 
    Green, 

    [EnumMember] 
    Amber 
} 
+0

Từ EnumMember làm thế nào để tôi có được mô tả hoặc giá trị? –

3

Có một workaround nếu mục đích là để lộ một văn bản hiển thị cho các thành viên enum, xác định enum bạn theo cách này trong hợp đồng:

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

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

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

các SvcUtils serialization tạo ra một kết quả thú vị:

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 
} 

Bạn có thể đọc Giá trị EnumMemberAttribute bằng cách phản ánh và bạn đã nhận được nó. Ngoài ra các tập tin XSD siêu dữ liệu được tạo ra bởi serialization svcutil được như mong đợi:

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

Các vấn đề liên quan