У меня есть класс, который представляет данные кредитной карты. Для представления действительных месяцев и месяцев истечения срока действия я использую четыре свойства типа int
:
public int ValidFromMonth { get; set; }
public int ValidFromYear { get; set; }
public int ExpiresEndMonth { get; set; }
public int ExpiresEndYear { get; set; }
Я выполняю XML-сериализацию этого класса для использования третьей стороной. Эта третья сторона требует, чтобы моим месяцам и годам предшествовал начальный ноль, если значение меньше 10
<validFromMonth>02</validFromMonth>
<validFromYear>09</validFromYear>
<expiresEndMonth>10</expiresEndMonth>
<expiresEndYear>14</expiresEndYear>
Поддерживает ли .NET какую-либо атрибуцию (или я могу создать собственный атрибут), который будет применять это правило, возможно, с использованием строки формата (например, {0:00}
)?
Примечание: я знаю, что мог бы добавить свои собственные свойства string
, которые выполняют внутреннее форматирование, и добавить атрибут [XmlIgnore]
в мои свойства int
, но это похоже на второсортное решение.
Edit:
После некоторого рассмотрения я задаюсь вопросом, действительно ли это просто не осуществимо. Сериализация не будет проблемой, но для того, чтобы десериализация работала, вам нужно отформатировать сериализованную строку. В приведенном выше тривиальном примере это было бы легко, но я не уверен, что это можно сделать для более общего случая.
Edit2:
Схема XML, определяющая двухзначное требование, приведена ниже.
Простые определения типов:
<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>
Определение кредитной карты, которое использует эти типы:
<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>