4

クラス(サードパーティによって作成および保守されている)を取得し、それを魔法のC#シュガーでラップして、各メンバー関数(またはそれ以上)をカスタムロックメカニズム(またはロギングメカニズムなど)でラップできるようにしたいです。

例えば、

 class Foo { // someone else wrote this and I can't touch it.
     void A() {}
     void B() {}
     // plus 10,000 other functions I don't want to know about
 }

 class WrappedFoo : Foo { // this is my class, I can do what ever I want
      // this is pseudo code !!
     OnMemberInvoke(stuff) {
        lock {
            Console.WriteLine("I'm calling " + stuff);
            MemberInvoke(stuff);
            Console.Writeline("I'm done calling " + stuff);
        }
     }
     // I could also deal with OnMemberInvokeStart() and OnMemberInvokeDone()
     // pairwise hooks too.
 }

 WrappedFoo wfoo = new WrappedFoo();
 wfoo.A();
 wfoo.B();

出力

 I'm calling A
 I'm done calling A
 I'm calling B
 I'm done calling B

DynamicObjectsこれはとでできると思いますTryInvokeMemberが、C#で気に入っている型チェックとタブ補完がすべて失われます。この例ではlock、スレッドセーフについて言及しましたが、これを行う一般的な方法を探しています。このコードは、再試行やロギングなどの追加レイヤーを必要とする実際のハードウェアテストを対象としています。

4

2 に答える 2

2

私はすでにSOで答えを見つけました。

プロジェクトで各関数をラップする方法は?

流行語はAOP(アスペクト指向プログラミング)です。

VisualStudioには組み込まれていません。PostSharpとAspectDNGがあります:

http://www.sharpcrafters.com/postsharp/features

http://aspectdng.tigris.org/nonav/doc/index.html

于 2012-09-20T21:23:00.800 に答える
2

アスペクト指向プログラミングを調査することをお勧めします。

PostSharpは、スレッデッドコードなど、メソッド呼び出しの前後にコードを挿入できる非常に人気のあるフレームワークです。これは、ロックの例です。それはロギング
に も役立つ可能性があります、ここに例があります

于 2012-09-20T21:23:02.390 に答える