序列化枚举和添加说明

时间:2013-09-19 11:05:18

标签: c# wcf

我有一个枚举:

public enum DriveConfig
{
    [Description("4X2")]
    FOURXTWO=0,

    [Description("4x4")]
    FOURXFOUR=1,

    [Description("6x2")]
    SIXBYTWO=2,

    [Description("6x4")]
    SIXBYFOUR=3

}

在我的系统中,我可以通过以下方式获得简单易懂的描述:

public static string GetDescriptionFromEnumValue(Enum value)
    {
        DescriptionAttribute attribute = value.GetType()
            .GetField(value.ToString())
            .GetCustomAttributes(typeof(DescriptionAttribute), false)
            .SingleOrDefault() as DescriptionAttribute;
        return attribute == null ? value.ToString() : attribute.Description;
    }

效果非常好。

但现在我需要使用webservices扩展系统,所以我正在制作我的对象的dto,并将它们序列化。直截了当。但是如何在另一端包含描述呢?

我试过这个

[DataContract]
public enum DriveConfigDto
{
    [Description("4X2")]
    [EnumMember]
    FOURXTWO=0,

    [Description("4x4")]
    [EnumMember]
    FOURXFOUR=1,

    [Description("6x2")]
    [EnumMember]        
    SIXBYTWO=2,

    [Description("6x4")]
    [EnumMember]
    SIXBYFOUR=3
}

但我无法访问另一端的说明

4 个答案:

答案 0 :(得分:1)

这不起作用,因为这些属性不会自动序列化。

答案 1 :(得分:0)

在常见情况下你不能这样做,因为你的网络服务可能有非.NET客户端(因此,它对属性一无所知,因为属性不是合同的一部分)。

但如果您在客户端使用.NET受限,则可以在服务器和客户端之间共享合同。

答案 2 :(得分:0)

如果我理解正确,您可以使用EnumMemberAttribute的Value属性:

[DataContract]
public enum DriveConfigDto
{
    [EnumMember(Value="4X2")]
    FOURXTWO=0,

    [EnumMember]
    FOURXFOUR=1,

    [EnumMember]        
    SIXBYTWO=2,
}

生成的XSD将如下所示:

<xs:simpleType name="">
<xs:restriction base="xs:string">
<xs:enumeration value="4X2"/>
<xs:enumeration value="FOURXFOUR"/>
<xs:enumeration value="SIXBYTWO"/>
</xs:restriction>
</xs:simpleType>

答案 3 :(得分:0)

在添加服务引用之前,您必须引用定义了枚举的程序集,并在添加服务引用时将其添加到重用程序集列表中。