有没有办法在C#中透明地包装其他方法的方法?我想实现Moose的功能:http://search.cpan.org/perldoc?Moose::Manual::MethodModifiersC#:其他方法的包装方法
编辑:而透明我的意思是没有修改原来的方法。
有没有办法在C#中透明地包装其他方法的方法?我想实现Moose的功能:http://search.cpan.org/perldoc?Moose::Manual::MethodModifiersC#:其他方法的包装方法
编辑:而透明我的意思是没有修改原来的方法。
我认为你在寻找什么叫做面向方面编程。有很多C#库可以帮助解决这个问题。其中一个名为PostSharp(PostSharp的免费版本支持此功能)。这里是一个类似于驼鹿示例的例子。这将创建您可以在其他方法使用跟踪属性就这一额外功能的策略:
[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]
public void Foo() { /* ... */ }
现在,当Foo执行时,上面的OnEntry方法将在它之前运行,并且OnExit将在其后运行。
我可以修改参数,因为它们传递给函数?我看到我收到了他们,但我无法从文档中看出我是否可以改变它们。 – rpkelly 2011-02-02 05:57:43
的确,他们在.NET中被称为“代表”。请参阅:
寻求帮助。
关闭。但是我需要在不改写原始方法的情况下做到这一点。这就是我透明的意思。虽然,这是整洁:) – rpkelly 2011-02-01 21:40:07
不,不是它在穆斯完成的方式。你可能想看看一些AOP库。
您可以使用动态代理实现相同的效果。一个例子是Castle Dynamic Proxy。
这样的框架利用C#反射设施来构造'代理'或'包装'类。所以记住这一点。因为这个,有一定的开销。或者,你可以使用框架,可以create classes statically via code generation。
一些隔离库实现了允许用“绕行”或模拟方法替换调用方法的功能。您可能能够使用相同的功能来实现您所指的拦截。欲了解更多详情,请查看以下内容:
Rhino Mocks stubs and mocks are only good for interfaces?
你可能会用一些漂亮的反射,但我不认为它会很漂亮... – Alxandr 2011-02-01 21:30:37