1

私はAOPを初めて使用し、シャープ(2.1.0.0)を投稿します。私はプロパティ/メソッドのインターセプトを実験していて、自分が書いたクラスのインターセプターの側面を書くことができます。

私の目標は、コンパイル時までにロジックを含むリストを作成しないことです。

私が達成したいことの例は次のとおりです。

public class Foo
{
    //Implementation should throw an exception if more than 1 string added.
    public List<string> MyList { get; set; }
}

よくわからないのはリストです。リストでAdd()またはRemove()が呼び出されたときに、いくつかの検証を実行できるようにしたいと思います。リストを独自のカスタムリストクラスでラップし、クラスをアスペクト属性で装飾すれば、これを実行できると思います。

私は自分のカスタムリストを使用してこれを達成し、追加/削除の自分の実装で何か賢いことをすることができることを知っています-しかし、これは可能であれば避けたいものです。

これらの方法を傍受する他の(またはより良い)方法はありますか?特にポストシャープを使用しますか?

4

2 に答える 2

3

メソッドは仮想ではないList<T>ため、この方法でクラスを変更する方法はありません。Addプロパティが代わりに返した場合、MyListプロパティIList<string>によって返されたオブジェクトは、このタイプの検証を実行できます。

.NET Frameworkは、Collection<T>特定のリスト機能を拡張するのに役立つクラスを提供します。説明する機能を実装する最も簡単な方法は、そこからクラスを派生させ、で検証を実行することInsertItemです。

Collection<T>クラスはを実装するためIList<string>、プロパティタイプを変更する必要がありますFoo.MyList

AOP用に編集:この機能にAOPを使用する場合MyList、ユーザーが操作するリストを返す代わりに、Fooクラスは、バッキングリストに変更を加える前に必要な検証を実行するメソッドを提供Addします。Removeこの場合ReadOnlyCollection<T>MyListプロパティから戻って、リストがで提供されているメソッドを介してのみ操作されることを明確にしFooます。

于 2013-03-26T15:09:37.240 に答える
1

.NETには、ジェネリックリストのコレクション変更イベントはありません。これを聞きたくないことはわかっていますが、Listをラップするか、IListを実装するクラスを作成する必要があります。

于 2013-03-26T15:04:18.880 に答える