2016-02-05 322 views
1

我在WCF客戶端傳遞多個enum值時遇到問題。將枚舉值作爲參數傳遞

class Client 
{ 
    static void Main(string[] args) 
    { 
     ChannelFactory<IWCFService> channelFactor = new ChannelFactory<IWCFService>("HellowWorldServiceEndpoint"); 
     channelFactor.Open(); 

     IWCFService proxy = channelFactor.CreateChannel(); 
     Console.WriteLine(proxy.GetEnumString(EnumComponents.enumVal1)); // -> SUCCEDED HERE (only one Enum value) 
     // Console.WriteLine(proxy.GetEnumString(EnumComponents.enumVal1| EnumComponents.enumVal2)); // -> **** FAILS HERE with invalid enum type. ***** 
     Console.Read(); 
    } 
} 

例外是, 而試圖序列參數http://tempuri.org/:components時出錯。 InnerException消息是'枚舉值'enumVal1,enumVal2'對'Microsoft.Geospatial.Data.Gateway.ObjectModel.EnumComponents'類型無效,無法序列化。如果類型具有DataContractAttribute屬性,請確保存在必要的枚舉值並使用EnumMemberAttribute屬性標記''。請參閱InnerException以獲取更多詳細信息

僅供參考,枚舉來自在WCFclient,WCFserver和WCFinterface中作爲引用添加的公用庫。

如果是普通函數調用,也是一樣的。有沒有可能的方法來解決這個問題?

+0

請參閱[「應該在其標題中包含」標籤?「](http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles),其中共識是「不,他們不應該」! –

回答

0

您發送一串| -ed enum值的唯一原因是enum代表標誌。

WCF supports使用enums在少數情況下DataContract - 其中之一是標誌枚舉

在您enumFlagsAttribute裝飾它,序列化是通過以下方式做了一個案例:一個映射到數字

  • 試圖找到一個枚舉成員(與EnumMemberAttribute屬性適用)值。如果找到,發送一個包含該成員的列表。
  • 嘗試將數值分解爲一個總和,以便枚舉成員(每個都應用EnumMemberAttribute屬性)映射到總和的每個部分。發送所有這些成員的名單。請注意,貪婪算法用於找到這樣一個總和,因此不能保證即使它存在也能找到這樣的總和。爲避免此問題,請確保枚舉成員的數字值是2的冪。
  • 如果前面的兩個步驟失敗,且數字值不爲零,則引發SerializationException。如果數值爲零,則發送空列表。

因此,您需要枚舉如下所示:

[DataContract] 
[Flags] 
enum EnumComponents 
{ 
    [EnumMember] 
    enumVal1, 

    [EnumMember] 
    enumVal2 
} 

如果enum是從外部源,它並沒有FlagsAttribute你將不得不打破數字價值轉換成自己用EnumMemberAttribute裝飾的枚舉成員的總和。

+0

在我的情況下,枚舉是從外部來源,請您詳細說明(如果可能的話提供一些代碼片段)如何做到這一點..僅供參考,枚舉值是兩個冪。和枚舉有[Flags] ..枚舉看起來是這樣的,[國旗] 公共枚舉EnumComponents { \t \t enumVal1 = 1, \t \t enumVal2 = 2, \t \t enumVal3 = 4, \t \t enumVal4 = 8, \t} –

+0

好像你'enum'沒有'EnumMemberAttribute',所以WCF提供的算法不能中斷'enumVal1 | enumVal2'設置爲發送它們所需的2個分隔值。 –

+0

直接傳遞enum的值是否有效?如果你的枚舉來自外部源,那麼你可以編寫自己的類有邏輯給你的枚舉值,然後使用它 –

相關問題