51

我有几个不同的应用程序,我想在其中共享一个 C# 枚举。我不太清楚如何在常规应用程序和 WCF 服务之间共享枚举声明。

这是情况。我有 2 个轻量级 C# destop 应用程序和一个 WCF Web 服务,它们都需要共享枚举值。

客户 1 有

 Method1( MyEnum e, string sUserId );

客户 2 有

Method2( MyEnum e, string sUserId );

网络服务有

ServiceMethod1( MyEnum e, string sUserId, string sSomeData);

我最初的想法是创建一个名为 Common.dll 的库来封装枚举,然后在需要枚举的所有项目中引用该库。但是,WCF 使事情变得困难,因为您需要标记枚举以使其成为服务的一个组成部分。像这样:

[ServiceContract]
[ServiceKnownType(typeof(MyEnum))]
public interface IMyService
{
    [OperationContract]
    ServiceMethod1( MyEnum e, string sUserId, string sSomeData);
}

[DataContract]
public enum MyEnum{ [EnumMember] red, [EnumMember] green, [EnumMember] blue };  

所以....有没有办法在 WCF 服务和其他应用程序之间共享枚举?

4

4 回答 4

47

使用公共库应该没问题。枚举是可序列化的,不需要 DataContract 属性。

请参阅:http: //msdn.microsoft.com/en-us/library/ms731923.aspx

枚举类型。枚举,包括标志枚举,是可序列化的。可选地,枚举类型可以使用 DataContractAttribute 属性进行标记,在这种情况下,参与序列化的每个成员都必须使用 EnumMemberAttribute 属性进行标记

编辑:即便如此,将枚举标记为 DataContract 并让客户端库使用它应该没有问题。

于 2008-10-09T15:34:57.517 回答
36

我一定对过时的服务参考或其他东西有一些问题。我回去创建了一个包含枚举的公共库,一切正常。我只是添加了对服务接口文件的使用引用。

using Common;  

[ServiceContract]
[ServiceKnownType(typeof(MyEnum))]
public interface IMyService
{
    [OperationContract]
    ServiceMethod1( MyEnum e, string sUserId, string sSomeData);
}

我放弃了以下内容:

[DataContract]
public enum MyEnum{ [EnumMember] red, [EnumMember] green, [EnumMember] blue };

我猜由于枚举是通过 ServiceKnownType 引用的,因此不需要在外部库中使用 [DataContract] 或 [Enumerator] 对其进行标记

于 2008-10-09T20:16:45.107 回答
35

我有一个非常奇怪的问题,并认为它可能对你很有趣。当我在数据合同中使用枚举时,我也遇到了连接停止的问题。我花了很长时间才发现真正的问题是什么:我使用了分配了 int 值的枚举。它们从 1 而不是 0 开始。显然 WCF 要求有一个等于 0 的枚举值用于序列化。如果您没有在枚举中声明任何值,则会从 0 开始为您完成自动 int 值映射,所以一切都很好。但是,当您复制粘贴其他未分配 0 值的枚举定义时,您将无法通过 WCF 将其发送给您的客户端 - 奇怪但真实!

于 2010-07-30T12:21:00.063 回答
0

您可以将 int 值分配给您的 Enum 成员并仅使用 int 进行传输,并在必要时将它们转换回您的 Enum 类型

于 2008-10-09T15:37:52.923 回答