首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在WCF数据服务中使用枚举

在WCF数据服务中使用枚举
EN

Stack Overflow用户
提问于 2010-08-26 05:12:43
回答 6查看 15.9K关注 0票数 17

我正在尝试使用POCO数据模型手动构建一个enum数据服务,但我不知道如何正确地公开POCO值。假设一个简单的模型,比如:

public class Order
{
   public int ID {get; set;}
   public string Description {get; set;}
   public OrderStatus Status {get; set;}
}

public enum OrderStatus
{
   New,
   InProcess,
   Complete
}

如何通过OrderStatus 数据服务公开属性中的有价值信息?

如果不执行任何操作,数据服务将生成运行时错误(枚举是无效属性)。我所看到的至少可以解决错误的唯一答案是将enum属性标记为忽略,例如:

[System.Data.Services.IgnoreProperties("Status")]
public class Order ...

这是可行的,但它迫使您从服务层“省略”有价值的信息。在WCF数据服务中是否有使用枚举值的其他选项?

编辑:请注意,这是Astoria数据服务(也称为Astoria)。这不是原始的WCF服务,在这种情况下,答案会更清楚。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-08-26 08:59:55

WCF Data Services目前不支持枚举( OData协议也不支持枚举)。典型的解决方法是使用字符串和常量值,或整数和常量值。

票数 16
EN

Stack Overflow用户

发布于 2010-08-26 22:07:26

也许我们可以用下面的解决方法来“欺骗”它:

[System.Data.Services.IgnoreProperties("Status")]
public class Order
{
   public int ID {get; set;}
   public string Description {get; set;}
   public OrderStatus Status {get; set;}
   public int StatusValue
   {
      get
      {
           return (int)this.Status;
      }
      set
      {
          // Add validation here
          this.Status = (OrderStatus)value;
      } 
   }
}

public enum OrderStatus
{
   New,
   InProcess,
   Complete
}
票数 5
EN

Stack Overflow用户

发布于 2010-08-28 05:55:57

作为后续,“包装器”方法最终是有效的。实际上,编写了一个小类来包装数据服务中的enum并返回原始的int值:

[IgnoreProperties("EnumValue")]
public class OrderStatusWrapper
{
    private OrderStatus _t;

    public int Value
    {
        get{ return (int)_t; }
        set { _t = (OrderStatus)value; }
    }

    public OrderStatus EnumValue
    {
        get { return _t; }
        set { _t = value; }
    }

    public static implicit operator OrderStatusWrapper(OrderStatus r)
    {
        return new OrderStatusWrapper { EnumValue = r };
    }

    public static implicit operator OrderStatus(OrderStatusWrapper rw)
    {
        if (rw == null)
            return OrderStatus.Unresolved;
        else
            return rw.EnumValue;
    }
}  

这在很大程度上是基于为解决EF4的enum限制而给出的建议:

http://blogs.msdn.com/b/alexj/archive/2009/06/05/tip-23-how-to-fake-enums-in-ef-4.aspx

希望这项技术对其他人有所帮助。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3570249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档