2009-08-24 11 views
3

Existe-t-il un moyen de spécifier qu'un champ d'énumération [Flags] dans une classe doit être sérialisé en tant que représentation sous forme de chaîne (par exemple "Sunday, Tuesday") plutôt que la valeur entière ? Pour être plus précis, lorsque je renvoie le type SomeClass suivant dans un service Web, je veux obtenir un champ de chaîne nommé "Days" mais je reçois un champ numérique.Serialize [Flags] énumération sous forme de chaîne

[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; 
} 

Répondre

2

Non, mais vous pouvez définir votre propre « ENUM » en créant une structure qui fait la même chose,

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

Je ne sais pas DataContractSerializer, mais avec XmlSerializer il serait sérialisé comme "dimanche mardi". Je ne suis pas un expert WCF, mais je pense avoir lu quelque part que vous pouvez spécifier que XmlSerializer doit être utilisé à la place de DataContractSerializer

0

La meilleure façon que je pouvais penser était de créer une méthode d'extension sur MyEnum qui itère sur MyEnum. GetMembers(), et ceux qui bit à bit et à non zéro avec le MyEnum étant sérialisé, en appelant ToString() et en agrégeant à la chaîne de sortie.

Questions connexes