簡體   English   中英

傳遞枚舉值作為參數

[英]Passing enum value as parameter

我在從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中作為引用添加。

如果是正常的函數調用,則相同的炒鍋。 有沒有可能解決此問題的方法?

您發送一堆郵件的唯一原因| -ed enum值是在enum符號表示標志的情況下。

WCF在少數情況下支持enumsDataContract一起使用-其中之一是標志枚舉

在您的enum具有FlagsAttribute裝飾的情況下,可以通過以下方式完成序列化:

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

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

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

    [EnumMember]
    enumVal2
}

如果enum來自外部來源,並且沒有FlagsAttribute ,則必須將數值自己分解為用EnumMemberAttribute裝飾的枚舉成員的總和。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM