2010-03-24 21 views
3

Supposons que je xml comme celui-ci:Est-il possible de contraindre des valeurs de chaîne dans xml à bool?

<Server Active="No"> 
    <Url>http://some.url</Url> 
</Server> 

classe C# ressemble à ceci:

public class Server 
{ 
    [XmlAttribute()] 
    public string Active { get; set; } 

    public string Url { get; set; } 
} 

Est-il possible de changer la propriété active taper bool et ont XmlSerializer contraignent "Oui" « Non "booler des valeurs?

Modifier: Xml est reçu, je ne peux pas le modifier. Donc, en fait, je ne suis intéressé que par la désérialisation.

Répondre

3

Je pourrais Regardez une deuxième propriété:

[XmlIgnore] 
public bool Active { get; set; } 

[XmlAttribute("Active"), Browsable(false)] 
[EditorBrowsable(EditorBrowsableState.Never)] 
public string ActiveString { 
    get { return Active ? "Yes" : "No"; } 
    set { 
     switch(value) { 
      case "Yes": Active = true; break; 
      case "No": Active = false; break; 
      default: throw new ArgumentOutOfRangeException(); 
     } 
    } 
} 
+1

C'est une façon très pratique de le faire. Ma seule plainte est que ActiveString sera visible dans IntelliSense dans le même projet. – Kugel

+0

@Kugel - dans le * même * projet, oui. Le '[EditorBrowsable (...)]' essaie au moins de traiter * d'autres * projets, cependant. –

2

Oui, vous pouvez mettre en œuvre IXmlSerializable et vous aurez le contrôle sur la façon dont le code XML est sérialisé et désérialisé

+0

Cependant, dans le cas général (si l'on suppose t voici des objets imbriqués, etc) qui est une interface assez horrible à mettre en œuvre. –

0
public class Server 
{ 
    [XmlAttribute()] 
    public bool Active { get; set; } 

    public string Url { get; set; } 
} 

La classe précédente devrait se retrouver dans cette forme sérialisé:

<Server Active="false"> 
    <Url>http://some.url</Url> 
</Server> 
+0

... qui ne correspond pas vraiment à ce que l'OP a demandé (il ne peut pas changer le xml)? –