2009-08-24 72 views
3

有没有办法指定类中的[Flags]枚举字段应该被序列化为字符串表示形式(例如“Sunday,Tuesday”)而不是整数值(例如5) ?序列化作为字符串的[标志]枚举

更具体地说,当在Web服务中返回以下SomeClass类型时,我想要一个名为“Days”的字符串字段,但我得到一个数字字段。

[Flags] 
public enum DaysOfWeek 
{ 
    Sunday = 0x1, 
    Monday = 0x2, 
    Tuesday = 0x4, 
    Wednesday = 0x8, 
    Thursday = 0x10, 
    Friday = 0x20, 
    Saturday = 0x40 
} 
[DataContract] 
public class SomeClass 
{ 
    [DataMember] 
    public DaysOfWeek Days; 
} 

回答

2

没有,但你可以通过创建一个结构,做同样的事情定义你自己的“枚举”,

public struct MyDayOfWeek 
{ 
    private int iVal; 
    private bool def; 

    internal int Value 
    { 
     get { return iVal; } 
     set { iVal = value; } 
    } 
    public bool Defined 
    { 
     get { return def; } 
     set { def = value; } 
    } 
    public bool IsNull { get { return !Defined; } } 

    private MyDayOfWeek(int i) 
    { 
     iVal = i; 
     def = true; 
    }   

    #region constants 
    private const int Monday = new MyDayOfWeek(1); 
    private const int Tuesday = new MyDayOfWeek(2); 
    private const int Wednesday = new MyDayOfWeek(3); 
    private const int Thursday = new MyDayOfWeek(4); 
    private const int Friday = new MyDayOfWeek(5); 
    private const int Saturday = new MyDayOfWeek(6); 
    private const int Sunday = new MyDayOfWeek(7); 
    #endregion constants 

    public override string ToString() 
    { 
     switch (iVal) 
     { 
      case (1): return "Monday"; 
      case (2): return "Tuesday"; 
      case (3): return "Wednesday"; 
      case (4): return "Thursday"; 
      case (5): return "Friday"; 
      case (6): return "Saturday"; 
      case (7): return "Sunday"; 
     } 
    } 
} 
1

我不知道的DataContractSerializer,但XmlSerializer的会被序列化作为“星期日星期二”。我不是WCF专家,但我认为我在某处可以指定必须使用XmlSerializer而不是DataContractSerializer

0

我能想到的最好方法是在MyEnum上创建一个遍历MyEnum的扩展方法。 GetMembers(),以及在序列化MyEnum时按位和非零值的方法,调用ToString()并聚合到输出字符串。