代码之家  ›  专栏  ›  技术社区  ›  Todd

在WCF数据服务中使用枚举

  •  17
  • Todd  · 技术社区  · 15 年前

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

    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 通过OData WCF数据服务的属性?

    如果不执行任何操作,数据服务将生成运行时错误(枚举是无效属性)。我看到的唯一解决错误的方法是标记 枚举 被忽略的属性,例如:

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

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

    编辑: 请注意这是 WCF数据服务 (又名阿斯托利亚)。这不是原始的WCF服务,在这种情况下,答案更清楚。

    6 回复  |  直到 11 年前
        1
  •  16
  •   Vitek Karas MSFT    15 年前

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

        2
  •  5
  •   Boris Modylevsky    15 年前

    也许我们可以通过以下解决方法来“欺骗”它:

    [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
    }
    
        3
  •  5
  •   qujck Steven    12 年前

    作为后续工作,“包装器”方法最终起作用。基本上,一个小类是用来包装 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附近工作的建议。 枚举 限制:

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

    希望这项技术能帮助其他人。

        4
  •  2
  •   StuartLC    15 年前

    假设数据合同序列化,如:

    [DataContract]
    public class Order
    {
       [DataMember]
       public int ID {get; set;}
       [DataMember]
       public string Description {get; set;}
       [DataMember]
       public OrderStatus Status {get; set;}
    }
    
    [DataContract]
    public enum OrderStatus
    {
        [EnumMember]
        New,
        [EnumMember]
        InProcess,
        [EnumMember]   
        Complete
    }
    
        5
  •  0
  •   Community Mohan Dere    8 年前

    您需要使枚举成为数据协定。

    请参见以下示例: http://consultingblogs.emc.com/merrickchaffer/archive/2007/04/03/Passing-Enum-values-into-WCF-Service-operations.aspx

    [编辑]显然,情况并非总是如此: Sharing Enum with WCF Service

        6
  •  0
  •   Slava    14 年前

    您需要编写自己的queryprivider

        public object GetPropertyValue(object target, ResourceProperty resourceProperty)
        {
            object result = null;
            PropertyInfo info = target.GetType().GetProperty(resourceProperty.Name);
            if (info != null)
                result = info.GetValue(target, null);
            if (result is Enum)
                return Convert.ToInt32(result);
            return result;
        }
    
    
        public ResourceType GetResourceType(object target)
        {
            ResourceType result = null;
            Type tp = target.GetType();
            if (tp.IsEnum)
            {
                result =  ResourceType.GetPrimitiveResourceType(typeof(Int32));
                return result;
            }
            ....
            return result;
        }
    
    推荐文章