例えば、次のような固定長のテキストを出力する仕様があるとします。
No | 列名 | 長さ | 出力形式 |
---|---|---|---|
1 |
都道府県コード |
2 |
前ゼロ埋め |
2 |
都道府県名 |
10 |
後ろ半角スペース埋め |
また、以下の構造体に都道府県のデータが格納されているとします。
構造体
public struct Todofuken
{
/// <summary>
/// 都道府県コード
/// </summary>
public int Code { set; get; }
/// <summary>
/// 都道府県名
/// </summary>
public string Name { set; get; }
}
仕様を満たすため、以下のようなコーディングをすると思います。
(あくまでも一例です)
/// <summary>
/// 引数の都道府県データを固定長のテキストにして返す
/// </summary>
/// <param name="data">都道府県データ</param>
/// <returns>固定長テキスト</returns>
private string getFixedText(Todofuken data)
{
StringBuilder sb = new StringBuilder();
//都道府県コード 前0埋め2桁
sb.Append(data.Code.ToString().PadLeft(2, '0'));
//都道府県名後ろスペース埋め
sb.Append(data.Name.PadRight(10));
return sb.ToString();
}
これだと 『どの項目が何桁で、桁埋めで使用する文字は何か』 という情報がソースの中に埋もれてしまいます。
そこで属性の出番です。
属性の機能を使用すると 『どの項目が何桁で、桁埋めで使用する文字は何か』 という情報を構造体に記述できるようになります。
ソースを追う必要がなくなり、『どの項目が何桁で、桁埋めで使用する文字は何か』が一目瞭然になります。
もちろん、属性を利用するためにはいろいろとコーディングが必要になります。 その内容は次回以降に掲載します。 |
固定長情報を属性に記述するようにした構造体
public struct Todofuken
{
/// <summary>
/// 都道府県コード
/// </summary>
[FixedText(Len = 2, PadChar = '0', PadType = EPadType.Before)]
public int Code { set; get; }
/// <summary>
/// 都道府県名
/// </summary>
[FixedText(Len = 10, PadChar = ' ', PadType = EPadType.After)]
public string Name { set; get; }
}