2

MVC のようなシステムに使用する基本オブジェクトがあり、子孫の各プロパティは次のように記述されます。

public String FirstName
{
    get { return GetProperty<String>("FirstName", ref _FirstName); }
    set { SetProperty<String>("FirstName", ref _FirstName, value); }
}

これは、デバッグ目的と通知および検証目的の両方で行われます。getter を使用して、読み取ろうとしているものに明示的にフラグを立てたコード (これらのプロパティが変更された場合にのみ基本クラスが呼び出すことができるようにするため) が間違っている場合に警告し、setter を使用します。プロパティの変更通知、ダーティ フラグの処理、検証など。

簡単にするために、これらのメソッドの実装が次のようになっていると仮定しましょう。

protected T GetProperty<T>(String propertyName,
    ref T backingField)
{
    return backingField;
}

protected Boolean SetProperty<T>(String propertyName,
    ref T backingField,
    T newValue)
{
    backingField = newValue;
    return true;
}

もちろん、これらの両方にはさらに多くのコードがありますが、このコードは私の質問とは関係ありません。少なくともそう願っています。もしそうなら、私は質問を変更します。

とにかく、次のように、自動プロパティで呼び出しを自動的に実装する PostSharp アスペクトを書きたいと思います。

public String FirstName { get; set; }

私がこれを行う方法を知っている人はいますか?

私は OnMethodBoundaryAspect クラスを自分で作成しましたが、ref パラメーターを使用してジェネリック実装を呼び出す技術は私にはわかりません。

ここに 2 つのクラスがあります。TestObject クラスを拡張して、プロパティの取得と設定時に正しいメソッドを自動的に呼び出すようにしたいと考えています。

public class BaseObject
{
    protected T GetProperty<T>(String propertyName,
        ref T backingField)
    {
        return backingField;
    }

    protected Boolean SetProperty<T>(String propertyName,
        ref T backingField,
        T newValue)
    {
        backingField = newValue;
    }
}

public class TestObject : BaseObject
{
    public String FirstName
    {
        get;
        set;
    }

    public String LastName
    {
        get;
        set;
    }
}

編集: PostSharp フォーラムにも投稿されました。

4

1 に答える 1

2

それは非常に単純でなければなりません。OnEntry をオーバーライドし、独自のコードに基づいて戻り値を設定します。最後に次を使用します。

eventArgs.ReturnValue = GetValue(x,y);  
eventArgs.FlowBehavior = FlowBehavior.Return;

これにより、元の Get/Set 呼び出しが効果的に傍受されます。

同じパターンを使用してキャッシュの側面を示すこのブログを参照してください...

于 2008-11-03T23:17:35.223 に答える