C#の属性という便利な機能

例えば、次のような固定長のテキストを出力する仕様があるとします。

Table 1. 固定長項目
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; }
}