2009-08-24 21 views
3

クラス内の[Flags]列挙フィールドを整数値(例:5)ではなく文字列表現(たとえば「Sunday、Tuesday」)としてシリアル化するように指定する方法はありますか? ?[Flags]列挙型を文字列として

より具体的には、次のSomeClass型をWebサービスで返すときに、「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をして​​、それをシリアル化するだろう「Sunday Tuesday」とします。私はWCFのエキスパートではありませんが、DataContractSerializerの代わりにXmlSerializerを使用する必要があると指定することができます。

0

MyEnumを繰り返し処理するMyEnumの拡張メソッドを作成するのが最も良い方法です。 GetMembers()、そしてMyEnumが直列化されているビット単位とゼロ以外の値にToString()を呼び出し、出力文字列に集約します。