Supprimer la Valeur Null Types d'Être Émis par XmlSerializer

Veuillez considérer ce qui suit Montant de la valeur de la propriété type qui est marqué comme un nullable XmlElement:

[XmlElement(IsNullable=true)] 
public double? Amount { get ; set ; }

Quand nullable type de valeur est définie sur null, C# XmlSerializer résultat se présente comme suit:

<amount xsi:nil="true" />

Plutôt que émettant de cet élément, je voudrais le XmlSerializer pour supprimer l'élément complètement. Pourquoi? Nous sommes à l'aide de Authorize.NET pour les paiements en ligne et Authorize.NET rejette la demande si cet élément null existe.

La solution/solution de contournement est de ne pas sérialiser le Montant de la valeur de la propriété type. Au lieu de cela, nous avons créé une complémentaire propriété, SerializableAmount, qui est basée sur la Quantité et est sérialisé à la place. Depuis SerializableAmount est de type String, qui, comme les types de référence sont supprimées par le XmlSerializer si la valeur null par défaut, tout fonctionne très bien.

///<summary>
///Gets or sets the amount.
///</summary>
[XmlIgnore]
public double? Amount { get; set; }

///<summary>
///Gets or sets the amount for serialization purposes only.
///This had to be done because setting value types to null 
///does not prevent them from being included when a class 
///is being serialized.  When a nullable value type is set 
///to null, such as with the Amount property, the result 
///looks like: &gt;amount xsi:nil="true" /&lt; which will 
///cause the Authorize.NET to reject the request.  Strings 
///when set to null will be removed as they are a 
///reference type.
///</summary>
[XmlElement("amount", IsNullable = false)]
public string SerializableAmount
{
    get { return this.Amount == null ? null : this.Amount.ToString(); }
    set { this.Amount = Convert.ToDouble(value); }
}

De sûr, c'est juste une solution de contournement. Est-il le moyen le plus propre pour supprimer la valeur null éléments type de l'émission?

btw; "montant" (pour les paiements) peut-être mieux comme decimal.
Bon point: floating point l'argent est le mal.
Merci d'appeler cela ainsi.
Votre solution est très bonne, je l'utilise ainsi. Cependant la réponse de Marc, c'est encore mieux...

OriginalL'auteur Ben Griswold | 2009-08-18