Veuillez considérer la propriété de type valeur du montant suivante qui est marquée comme un XmlElement nullable :
[XmlElement(IsNullable=true)]
public double? Amount { get ; set ; }
Lorsqu'un type de valeur nullable est défini sur null, le résultat de C# XmlSerializer ressemble à ce qui suit :
<amount xsi:nil="true" />
Plutôt que d'émettre cet élément, je voudrais que le XmlSerializer le supprime complètement. Pourquoi ? Nous utilisons Authorize.NET pour les paiements en ligne et Authorize.NET rejette la demande si cet élément nul existe.
La solution actuelle consiste à ne pas sérialiser du tout la propriété Amount value type. Au lieu de cela, nous avons créé une propriété complémentaire, SerializableAmount, qui est basée sur Amount et est sérialisée à la place. Puisque SerializableAmount est de type String, qui comme les types de référence sont supprimés par le XmlSerializer s'ils sont nuls par défaut, tout fonctionne parfaitement.
/// <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: >amount xsi:nil="true" /< 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); }
}
Bien sûr, il ne s'agit que d'une solution de rechange. Existe-t-il un moyen plus propre de supprimer l'émission des éléments de type valeur nulle ?
5 votes
Btw ; "amount" (pour les paiements) peut être mieux utilisé comme
decimal
.1 votes
Bon point : la monnaie à virgule flottante est diabolique.
0 votes
Merci de l'avoir signalé également.
0 votes
Votre solution est très bonne, je l'utilise également. Cependant, la réponse de Marc est encore meilleure...