3

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

具体的には、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;
}
4

3 に答える 3

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";
        }
    }
}
于 2009-08-24T14:59:46.287 に答える
1

DataContractSerializerについてはわかりませんが、XmlSerializerを使用すると、「SundayTuesday」としてシリアル化されます。私はWCFの専門家ではありませんが、DataContractSerializerの代わりにXmlSerializerを使用する必要があることを指定できることをどこかで読んだと思います

于 2009-08-24T15:30:58.450 に答える
0

私が考えることができる最善の方法は、MyEnum で MyEnum.GetMembers() を反復処理する拡張メソッドを作成し、MyEnum をシリアル化し、ToString() を呼び出して出力文字列に集約してビット単位で非ゼロにする拡張メソッドを作成することでした。

于 2012-11-30T23:03:16.590 に答える