【问题标题】:Passing enums via WCF service通过 WCF 服务传递枚举
【发布时间】:2012-08-28 07:37:21
【问题描述】:

我需要在独立于我的 WCF 服务项目的项目中定义一个枚举。我正在创建一个包含枚举和其他数据的对象。当我通过 WCF 服务将对象传递给客户端时,我得到一个找不到。

枚举:

public enum Color
{
    Red = 1,
    Blue,
    Green,
}

要传递的对象:

public class MyObject
{
    public Color ColorEnum { get; set; }
    public string Name{ get; set; }
}

只有当我给对象一个默认值说 ColourEnum = Color.Red 时,服务才能工作。如果它没有设置它会中断。我知道这是一种解决方法,但我正在寻找一种更有意义的解决方案,而不是设置任意值。我只是想了解它为什么会坏

提前致谢

【问题讨论】:

  • Man...枚举永远不适合通过服务公开...
  • @AdilMughal 为什么? Enum 是一个不错的选择,并且绝对受到 SOAP 协议的支持。
  • 我同意它们是受支持的,但基于一些经验...查看 stackoverflow 帖子,其中包含关于枚举使用的一些很好的讨论 stackoverflow.com/questions/326339/…

标签: c# wcf


【解决方案1】:

我的 WCF 项目中有一个这样的枚举:

[DataContract]
public class CarBookReq
{
    [DataMember]
    public string RefNo { get; set; }

    [DataMember]
    public RateType MyProperty { get; set; }

}

[DataContract]
public enum RateType
{
    [EnumMember]
    silver,
    [EnumMember]
    gold,
    [EnumMember]
    platinum,
    [EnumMember]
    young,
    [EnumMember]
    youngplus
}

【讨论】:

    【解决方案2】:

    尝试在枚举值上添加EnumMember 属性。

    【讨论】:

    • 是的,现在就这样做了。仍然不起作用 - 缺少其他任何东西。我也将 [DataContract] 放在枚举上方
    • @nivensookharan 请为您的枚举指定一个默认值。序列化程序无法为您的 ColorEnum 属性指定值,因为默认值为 0,而您的枚举从 1 开始。
    【解决方案3】:

    问题是ColorEnum属性的默认值不是您的枚举的有效值:当您创建MyObject时,该属性的默认值为0,而0不对应于任何值你的枚举。

    您有多种选择来纠正这种行为。

    • 您可以在枚举声明中使用Red = 0 而不是Red = 1(甚至可以省略它,它会产生相同的效果)。这样一来,默认值将是 Red 而不是无意义的值。
    • 您可以将默认值 Default = 0 添加到您的枚举中,您知道它的含义是“颜色尚未定义”。
    • 您可以将您的属性设置为可为空的 Color?,因此 null 将成为该属性的合法值和默认值
    • 您可以让MyObject 的构造函数为 ColorEnum 属性分配默认颜色。

      公共 MyObject() { this.ColorEnum = 颜色.Red; }

    但是无论你做什么,枚举类型的默认值总是0。如果0不对应合法的枚举成员,那肯定是个问题。

    【讨论】:

    • 所以你说如果我添加一个枚举 Default = 0, 除了给属性一些没有意义的任意值之外,我没有办法覆盖默认值 0 吗?
    • @nivensookharan :我已经编辑了我的答案,其中包含一些您必须解决问题的选项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    相关资源
    最近更新 更多