如何将线程不安全的类包装成一个线程安全的类,而不包装每个成员函数

时间:2012-09-20 21:13:47

标签: c# binding invoke

我希望能够上课(由第三方编写和维护),用一些神奇的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

现在我认为我可以使用DynamicObjectsTryInvokeMember执行此操作,但之后我失去了所有关于C#的类型检查和标签完成功能。在这个例子中,我提到了lock的线程安全性,但我正在寻找一种通用的方法。此代码用于实际硬件测试,需要额外的重试层,日志记录等。

2 个答案:

答案 0 :(得分:2)

我已经在SO上找到了答案。

How to wrap each function in project?

流行语是AOP(面向方面​​编程)。

它没有内置到Visual Studio中。有PostSharp和AspectDNG:

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

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

答案 1 :(得分:2)

您可能需要调查Aspect Oriented Programming

PostSharp是一个非常流行的框架,可以在方法调用之前/之后注入代码,例如线程代码,这是Locking上的示例。
这也可以帮助记录,这里是example