निम्नलिखित राशि मान प्रकार संपत्ति जो एक नल XmlElement के रूप में चिह्नित किया गया है पर विचार करें:से दबाने शून्य मान प्रकार XmlSerializer
[XmlElement(IsNullable=true)]
public double? Amount { get ; set ; }
एक नल मान प्रकार अशक्त करने के लिए सेट किया जाता है, सी # XmlSerializer परिणाम दिखता है निम्न की तरह:
<amount xsi:nil="true" />
इस तत्व को उत्सर्जित करने के बजाय, मैं XmlSerializer को पूरी तरह से तत्व को दबाने के लिए चाहता हूं। क्यूं कर? हम ऑनलाइन भुगतान के लिए Authorize.NET का उपयोग कर रहे हैं और Authorize.NET अनुरोध को अस्वीकार करता है यदि यह शून्य तत्व मौजूद है।
वर्तमान समाधान/वर्कअराउंड राशि मूल्य प्रकार की संपत्ति को क्रमबद्ध नहीं करना है। इसके बजाए हमने एक पूरक संपत्ति बनाई है, SerializableAmount, जो राशि पर आधारित है और इसके बजाय क्रमबद्ध है। चूंकि SerializableAmount प्रकार स्ट्रिंग का है, जो संदर्भ प्रकारों की तरह XmlSerializer द्वारा दबाया जाता है यदि डिफ़ॉल्ट रूप से शून्य, सबकुछ बढ़िया काम करता है।
/// <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); }
}
बेशक, यह सिर्फ एक कामकाज है। क्या शून्य मूल्य प्रकार तत्वों को उत्सर्जित होने से दबाने का एक क्लीनर तरीका है?
btw; "राशि" (भुगतान के लिए) 'दशमलव' के रूप में बेहतर हो सकती है। –
अच्छा बिंदु: फ़्लोटिंग पॉइंट पैसा बुरा है। –
@Marc इसे भी कॉल करने के लिए धन्यवाद। –