Ich habe eine Klasse, die Kreditkartendaten darstellt. Für die Darstellung gültig ab und Ablauf Monaten und Jahren verwende ich vier Eigenschaften des Typs int
:Formatierung Element/Attribut-Werte mit XML-Serialisierung
public int ValidFromMonth { get; set; }
public int ValidFromYear { get; set; }
public int ExpiresEndMonth { get; set; }
public int ExpiresEndYear { get; set; }
Ich bin XML Serialisierung dieser Klasse für den Verzehr durch einen Dritten. Das Dritter bedarf meinen Monat und Jahr Werte mit einer führenden Null vorangestellt werden, wenn der Wert kleiner als 10
<validFromMonth>02</validFromMonth>
<validFromYear>09</validFromYear>
<expiresEndMonth>10</expiresEndMonth>
<expiresEndYear>14</expiresEndYear>
Unterstützt .NET jegliche Zuschreibung (oder ist es mir möglich, ein benutzerdefiniertes Attribut zu erstellen), dass Wird diese Regel erzwingen, möglicherweise unter Verwendung einer Formatzeichenfolge (zB {0:00}
)?
Hinweis: Ich weiß, dass ich meine eigenen string
Eigenschaften hinzufügen könnte, das die Formatierung intern tun, und fügen Sie ein [XmlIgnore]
Attribut auf meine int
Eigenschaften, aber das fühlt sich an wie eine zweitklassige Lösung.
Bearbeiten: Nach einiger Überlegung frage ich mich, ob dies tatsächlich nicht machbar ist. Serialisierung wäre kein Problem, aber damit die Deserialisierung funktionieren kann, müssen Sie die serialisierte Zeichenfolge wieder formatieren. Im obigen Beispiel wäre das einfach, aber ich bin mir nicht sicher, ob es im allgemeineren Fall funktionieren könnte.
Edit2: Das XML-Schema, das die zweistellige Anforderung definiert, ist unten.
Einfache Typdefinitionen:
<xs:simpleType name="CreditCardMonthType">
<xs:annotation>
<xs:documentation>Two digit month</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:minLength value="2" />
<xs:maxLength value="2" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="CreditCardYearType">
<xs:annotation>
<xs:documentation>Two digit year</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:minLength value="2" />
<xs:maxLength value="2" />
</xs:restriction>
</xs:simpleType>
Kreditkarte Definition, die diese Typen verwendet:
<xs:attribute name="ExpiryMonth" type="CreditCardMonthType" use="required">
<xs:annotation>
<xs:documentation>Credit/debt card's expiry month.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="ExpiryYear" type="CreditCardYearType" use="required">
<xs:annotation>
<xs:documentation>Credit/debt card's expiry year.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="StartMonth" type="CreditCardMonthType" use="optional">
<xs:annotation>
<xs:documentation>Switch card's start month.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="StartYear" type="CreditCardYearType" use="optional">
<xs:annotation>
<xs:documentation>Switch card's start year.</xs:documentation>
</xs:annotation>
</xs:attribute>
Das ist sehr gut - aber ich denke, ich werde noch Sie müssen Ihren LeadingZero-Klassenansatz seit Jahren anwenden. –
Wahrscheinlich. Deshalb habe ich es aufgegeben. Ich dachte, sie wären anders genug, um sie als separate Antworten zu halten (abhängig von Ihren Bedürfnissen). Ich würde wirklich sehen, wie sie das Jahr-Feld zu 4 Ziffern erweitern. Ich meine, komm schon, sie verwenden bereits ein ausführliches Format (XML), wie viel denken sie, dass sie sparen, indem sie nur zwei Ziffern für das Jahr verwenden? Aber ich verstehe, wenn Sie mit ihnen Schema festhalten. So oder so, diese beiden Dinge sollten helfen, das zu erreichen, was Sie brauchen. –