将枚举值作为参数传递

时间:2016-02-05 11:10:06

标签: c# .net wcf enums

我在从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和WCF接口中作为引用添加的公共库。

如果它是正常的函数调用,则相同。有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:0)

您发送大量| - ed enum值的唯一原因是enum符号标记。

WCF supports在少数情况下enums使用DataContract - 其中一个是 标记枚举

如果您的enum FlagsAttribute装饰它,则序列化按以下方式完成:

  
      
  • 尝试查找映射到数值的枚举成员(已应用EnumMemberAttribute属性)。如果找到,请发送仅包含该成员的列表。
  •   
  • 尝试将数值分解为一个总和,使得枚举成员(每个都应用了EnumMemberAttribute属性)映射到总和的每个部分。发送所有这些成员的列表。注意,贪婪算法用于找到这样的总和,因此不能保证即使它存在也能找到这样的总和。要避免此问题,请确保枚举成员的数值为2的幂。
  •   
  • 如果前两个步骤失败,并且数值非零,则抛出SerializationException。如果数值为零,则发送空列表。
  •   

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

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

    [EnumMember]
    enumVal2
}

如果enum来自外部来源并且没有FlagsAttribute,则必须将数值分解为自己用EnumMemberAttribute装饰的枚举成员的总和。