AspectDNG を使って private なフィールドにアクセスするメソッドを追加する

ターゲットクラスの private なフィールドにアクセスするメソッドを追加するには、アスペクトの定義クラスに Insert カスタムアトリビュートを使ってメソッドを実装すればよいだけだが、コンパイルを通すために アスペクトの定義クラスでターゲットクラスと同じフィールド名のダミーフィールドを定義する必要がある。

なお、Insert カスタムアトリビュートを使った追加ではプロパティの定義を追加する事ができない模様。

アスペクト適用対象のクラスを作成

using System;

public class Data
{
    private string name;

    public Data(String name)
    {
        this.name = name;
    }

    public void Print()
    {
        Console.WriteLine("name:{0}", this.name);
    }
}

アスペクト定義クラスを作成

ダミーの name フィールドを定義しておく事に注意。

using DotNetGuru.AspectDNG.Joinpoints;

public class SimpleAspect
{
    //コンパイルを通すためのダミーフィールド
    private string name;

    [Insert("Data")]
    public void set_Name(string value)
    {
        //実際は Data オブジェクトの name フィールドに値を設定する
        name = value;
    }

    //以下のようなプロパティ定義を使った追加はできない模様
    //[Insert("Data")]
    //public string Name { set{ name = value; } }
}

動作確認用のテストクラスを作成

public class Tester
{
    public static void Main(string[] args)
    {
        Data data = new Data("てすと");
        data.Print();

        data.set_Name("abc");
        data.Print();
    }
}

実行結果

>Tester.exe
name:てすと?
name:abc?

出力の最後に ? が付いている理由は不明。