与WCF服务共享枚举

我有几个不同的应用程序,我想分享一个C#枚举。 我不能完全弄清楚如何共享常规应用程序和WCF服务之间的枚举声明。

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

客户1有

Method1( MyEnum e, string sUserId ); 

客户端2有

 Method2( MyEnum e, string sUserId ); 

Webservice有

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

我最初的目的是创build一个名为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服务和其他应用程序中的枚举?

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

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

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

编辑:即使如此,不应该有枚举标记为DataContract和有客户端库使用它的问题。

我必须有一些过时的服务参考或一些问题。 我回去创build了一个包含枚举的通用库,并且一切正常。 我只是添加了对服务接口文件的使用引用。

 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]的外部库中标记出来,

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

您可以将int值分配给您的枚举成员,只需使用int进行传输,并在需要时将它们转换回您的枚举types