1

我有一个这样的枚举:

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

效果很好。

但是现在我需要使用 web 服务扩展系统,所以我正在制作我的对象的 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

4 回答 4

1

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

于 2013-09-19T11:13:58.323 回答
0

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

但是,如果您在客户端受限于 .NET,您可以在服务器和客户端之间共享合同程序集。

于 2013-09-19T11:13:15.787 回答
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>
于 2013-09-19T11:22:47.910 回答
0

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

于 2013-09-19T11:27:43.543 回答