2008-10-09 111 views
47

我有幾個不同的應用程序,我想分享一個C#枚舉。我無法弄清楚如何在常規應用程序和WCF服務之間共享一個枚舉聲明。與WCF服務共享枚舉

這是情況。我有2個輕量級C#destop應用程序和一個WCF webservice,都需要共享枚舉值。

客戶端1具有

Method1(MyEnum e, string sUserId); 

客戶端2具有

Method2(MyEnum e, string sUserId); 

Webservice的具有

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服務和其他應用程序之間共享一個枚舉?

+0

建議避免在Web服務中枚舉,因爲它們會創建微妙的向後兼容問題。請參閱http://stackoverflow.com/a/788281/52277 – 2013-07-21 10:00:50

+1

不適用於此情況;引用的向後兼容性問題是由於將枚舉返回給客戶端(非常明顯可以打破它們),而不是將枚舉作爲輸入。 – 2013-08-03 00:07:28

回答

45

使用公共庫應該沒問題。枚舉是可序列化的,並且不需要DataContract屬性。

請參見: http://msdn.microsoft.com/en-us/library/ms731923.aspx

枚舉類型。包括標誌枚舉在內的枚舉是可串行化的 。或者,枚舉類型可以打上 DataContractAttribute屬性,在這種情況下,每一個成員都認爲 參與了系列化必須與 EnumMemberAttribute標記屬性

編輯:即便如此,應該沒有問題,與具有枚舉標記爲DataContract並使用它的客戶端庫。

+4

建議避免在Web服務中枚舉,因爲它們會創建微妙的向後兼容問題。請參閱http://stackoverflow.com/a/788281/52277 – 2013-07-21 09:57:54

0

你可以分配INT值的枚舉成員,只是使用int的轉移,並在必要時將它們轉換回到你的枚舉類型

+4

擊敗枚舉的目的。 – Gaui 2014-06-12 15:33:12

33

我必須有與過時的服務引用或某事的一些問題。我回去創建了一個包含枚舉的公共庫,並且一切正常。我只是添加了對服務接口文件的使用引用。

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]或[枚舉]

+0

爲我工作很好。謝謝! – Contango 2010-11-05 15:24:46

32

我有一個很奇怪的問題,並認爲它可能會讓你感興趣。我在使用數據合同中的枚舉時遇到了連接中斷的問題。我花了很長時間才發現真正的問題是什麼:我用int值賦值的枚舉。它們從1開始,而不是從0開始。顯然,WCF要求序列化時枚舉值等於0。如果你沒有在你的枚舉中聲明任何值,一個自動的int值映射將爲你開始0,所以一切都很好。但是,當你複製粘貼其他枚舉定義的0值沒有被分配的時候,你不會通過WCF將它們傳遞給你的客戶端 - 奇怪而真實!