有没有办法在C#中透明地包装其他方法中的方法?我想实现Moose围绕功能所做的工作:http://search.cpan.org/perldoc?Moose::Manual::MethodModifiers
编辑:透明,我的意思是不修改原始方法。
答案 0 :(得分:4)
我认为你正在寻找所谓的面向方面编程。有许多C#库可以帮助解决这个问题。一个叫PostSharp(PostSharp的免费版本支持此功能)。这是一个类似于驼鹿示例的示例。这将创建一个Trace属性,您可以在其他方法上使用它来实现这一额外功能:
[Serializable]
public class TraceAttribute : OnMethodBoundaryAspect
{
public override void OnEntry( MethodExecutionArgs args )
{
Trace.WriteLine("about to call method");
}
public override void OnExit(MethodExecutionArgs args)
{
Trace.WriteLine("just finished calling method");
}
}
您可以通过将Trace属性放在它之前将其添加到方法“Foo”:
[Trace]
public void Foo() { /* ... */ }
现在当Foo执行时,上面的OnEntry方法将在它之前运行,而OnExit将在之后运行。
答案 1 :(得分:2)
实际上,他们在.NET中被称为“代理人”。参见:
寻求帮助。
答案 2 :(得分:2)
使用动态代理可以达到同样的效果。一个例子是Castle Dynamic Proxy。
此类框架利用C#反射工具构建“代理”或“包装”类。所以记住这一点。由于这个原因,有一定的开销。或者,您可以使用create classes statically via code generation。
的框架答案 3 :(得分:0)
不,不是在Moose中完成的方式。您可能想要查看一些AOP库。
答案 4 :(得分:0)
某些隔离库实现了允许使用“detours”或mock方法替换对方法的调用的功能。您可以使用相同的功能来实现您所指的拦截。有关更多详细信息,请查看以下内容:
Rhino Mocks stubs and mocks are only good for interfaces?