与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