是否可以在C#中为静态类或静态方法生成动态代理?

Jef*_*eff 1 c# aop castle-dynamicproxy

我试图想出一种方法(动态或实例)方法调用可以被动态代理拦截.我想将它作为c#扩展方法实现,但坚持如何为静态方法生成动态代理.

一些用法:

Repository.GetAll<T>().CacheForMinutes(10);
Repository.GetAll<T>().LogWhenErrorOccurs();

//or     
var repo = new Repository();
repo.GetAll<T>().CacheForMinutes(10);
repo.GetAll<T>().LogWhenErrorOccurs();
Run Code Online (Sandbox Code Playgroud)

我对任何图书馆(linfu,castle.dynamic proxy 2等)开放.

谢谢!

Aar*_*ght 9

完全不可能.

事实上,代理甚至无法在所有实例方法上生成- 它们必须是虚拟的,因此代理生成器可以创建派生类并覆盖它们.

静态方法永远不是虚拟的,因此不能被代理覆盖.

(从技术上讲,非虚拟方法的解决方法是从中派生类MarshalByRefObject,但基于远程处理的解决方案是缓慢而笨重的,但仍然不支持静态方法.)

鉴于您的类已命名Repository,我将建议您改为使用这些方法实例方法.通常不应该static开始这些操作.如果你制作它们static,你会丢失很多东西:松耦合,模拟,依赖注入,一定数量的单元可测试性,以及 - 正如你刚刚发现的那样 - 代理和拦截.