2009-09-14 7 views
10

J'ai utilisé xsd.exe pour générer une classe pour la désérialisation de XML. Je ont une valeur décimale dans la xsd source qui n'est pas nécessaire:Valeur nullable avec la classe générée par xsd.exe

<xs:attribute name="Balance" type="xs:decimal" use="optional" /> 

La classe résultant de xsd génère le code suivant:

private decimal balanceField; 

[System.Xml.Serialization.XmlAttributeAttribute()] 
public decimal Balance { 
    get { 
     return this.balanceField; 
    } 
    set { 
     this.balanceField = value; 
    } 
} 

Ce que je note ne fait pas annulable.

Comment puis-je générer le champ à la place comme annulable, illustré comme suit:

private decimal? balanceField; 

[System.Xml.Serialization.XmlAttributeAttribute()] 
public decimal? Balance { 
    get { 
     return this.balanceField; 
    } 
    set { 
     this.balanceField = value; 
    } 
} 

Répondre

8

Actuellement, il fonctionne comme il se doit. J'utilise v2.0.50727.42 xsd et:

<xs:element name="Port" type="xs:int" nillable="true" /> 

génère exactement ce que vous avez cherché (sans redondant champ ...Specified et propriété):

private System.Nullable<int> portField; 

[System.Xml.Serialization.XmlElementAttribute(IsNullable = true)] 
public System.Nullable<int> Port { 
    get { 
     return this.portField; 
    } 
    set { 
     this.portField = value; 
    } 
} 
+5

Cela ne fonctionne que pour les éléments, pas pour les attributs comme la question initialement posée. –

2

Je viens de remarquer qu'il a effectivement inclus le code suivant:

private bool balanceFieldSpecified; 

[System.Xml.Serialization.XmlIgnoreAttribute()] 
public bool BalanceSpecified { 
    get { 
     return this.balanceFieldSpecified; 
    } 
    set { 
     this.balanceFieldSpecified = value; 
    } 
} 

qui fournit la fonctionnalité J'ai besoin.

Je vais laisser la question ouverte pendant un certain temps au cas où il y aurait une façon élégante d'utiliser nullable? tapez plutôt.

+6

Malheureusement, xsd.exe était autour Bien avant les types nullables existants dans le framework .NET, ils ont dû trouver une solution qui fonctionne dans tous les cas. Je ne connais aucun moyen de dire à xsd.exe d'utiliser des types Nullable à la place ..... (quelqu'un devrait intensifier et créer une alternative utile à xsd.exe un jour! :-)) –

+0

Un kludge similaire existe pour xsd.exe DataSets générés, sauf qu'au lieu d'une propriété, la ligne contiendra une méthode 'IsBalanceNull()'. –

+0

@marc_s xsd2code essaie de fournir cette fonctionnalité. –

5

Je crois que si vous ajoutez nillable = "true" dans votre définition de schéma XML, XSD créera un type Nullable pour cet élément. C'est probablement une bonne idée de toute façon, puisque vous laissez entendre que cette valeur est vraiment nul, ce qui rendrait la définition de votre schéma plus explicite à cet égard.

Malheureusement, il inclut toujours le champ "Spécifié" correspondant dans ce cas. Si vous souhaitez que le sérialiseur obéisse directement à la valeur Null, vous devrez supprimer manuellement la colonne "xxSpecified" du code généré.

Questions connexes