【发布时间】:2011-06-19 13:59:58
【问题描述】:
有没有办法在 C# 中透明地包装其他方法中的方法?我想实现 Moose 的周边功能:http://search.cpan.org/perldoc?Moose::Manual::MethodModifiers
编辑:透明是指不修改原始方法。
【问题讨论】:
-
你可能可以通过一些漂亮的反思,但我不认为它会很漂亮......
有没有办法在 C# 中透明地包装其他方法中的方法?我想实现 Moose 的周边功能:http://search.cpan.org/perldoc?Moose::Manual::MethodModifiers
编辑:透明是指不修改原始方法。
【问题讨论】:
【讨论】:
不,不是 Moose 中的做法。您可能想查看一些 AOP 库。
【讨论】:
您可以通过使用动态代理来实现相同的效果。一个例子是Castle Dynamic Proxy。
此类框架利用 C# 反射工具来构造“代理”或“包装器”类。所以记住这一点。因此存在一定的开销。或者,您可以使用可以create classes statically via code generation 的框架。
【讨论】:
一些隔离库实现了允许用“detours”或模拟方法替换对方法的调用的功能。您也许可以使用相同的功能来实现您所指的拦截。有关详细信息,请检查以下内容:
Rhino Mocks stubs and mocks are only good for interfaces?
【讨论】:
我认为您正在寻找所谓的面向方面编程。有许多 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 属性将其添加到方法“Foo”:
[Trace]
public void Foo() { /* ... */ }
现在当 Foo 执行时,上面的 OnEntry 方法将在它之前运行,而 OnExit 将在它之后运行。
【讨论】: