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(面向方面​​的编程)。

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

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

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

于 2012-09-20T21:23:00.800 回答
2

您可能想研究Aspect Oriented Programming

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

于 2012-09-20T21:23:02.390 回答