C# 序列化枚举和添加描述
我有一个这样的枚举:C# 序列化枚举和添加描述,c#,wcf,C#,Wcf,我有一个这样的枚举: public enum DriveConfig { [Description("4X2")] FOURXTWO=0, [Description("4x4")] FOURXFOUR=1, [Description("6x2")] SIXBYTWO=2, [Description("6x4")] SIXBYFOUR=3 } 在我的系统中,我可以通过以下方式轻松地获得描述: public static st
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
}
但我无法访问另一端的描述在常见情况下,您不能这样做,因为您的web服务可能有非.NET客户端(因此,它对属性一无所知,因为属性不是合同的一部分)
但是,如果您在客户端受限于.NET,您可以在服务器和客户端之间共享契约程序集。在常见情况下,您不能这样做,因为您的web服务可能有非.NET客户端(因此,它对属性一无所知,因为属性不是契约的一部分)
但如果您在客户端受到.NET的限制,则可以在服务器和客户端之间共享协定程序集。这将不起作用,因为这些属性不会自动序列化。这将不起作用,因为这些属性不会自动序列化。如果我理解正确,您可以使用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>
如果我理解正确,您可以使用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>
在添加服务引用之前,您必须引用定义了枚举的组件,并在添加服务引用时将其添加到重用程序集列表。在添加服务引用之前,您必须引用定义了枚举的组件,并在添加服务引用时将其添加到重用程序集列表中服务参考。如何“解包”另一侧的枚举?完全正确。这就是问题所在。呵呵,好的。您是如何尝试解压缩枚举的?接收端的枚举是什么样子的?像普通的枚举,减去描述:)那么它就不工作了。新枚举没有description属性。简单到:)如果您真的需要描述,我建议您使用类(或其他东西)而不是枚举。。我不认为枚举被设计成有一个描述..你如何在另一边“解包”枚举?没错。这就是问题所在。呵呵,好的。您是如何尝试解压缩枚举的?接收端的枚举是什么样子的?像普通的枚举,减去描述:)那么它就不工作了。新枚举没有description属性。简单到:)如果您真的需要描述,我建议您使用类(或其他东西)而不是枚举。。我不认为枚举是为了有一个描述而设计的。让我们把任务变得更复杂:[description(“4x2”)]
让任务变得更复杂:[description(“4x2”)]
true。现在,客户端实际上在我的控制之下,所以它将在.net中。只需将其视为一种类型:将原始(非序列化)枚举移动到所有项目都可以看到的自己的dll中(原始网站,新的web服务,新的客户端应用程序。然后在客户端从dto转换回domaintrue。现在,客户端实际上在我的控制下,所以它将在.net中。只是作为一种类型考虑:将原始(非序列化)枚举移动到所有项目都可以看到的自己的dll中(原始网站、新的web服务、新的客户端应用程序。然后在客户端将dto转换回域