【发布时间】:2008-08-25 09:00:23
【问题描述】:
对于给定的类,我希望具有跟踪功能,即我希望记录每个方法调用(方法签名和实际参数值)和每个方法退出(仅方法签名)。
我如何做到这一点假设:
- 我不想使用任何第三方 C# 的 AOP 库,
- 我不想将重复的代码添加到我要跟踪的所有方法中,
- 我不想更改类的公共 API - 类的用户应该能够以完全相同的方式调用所有方法。
为了让问题更具体,我们假设有 3 个类:
public class Caller
{
public static void Call()
{
Traced traced = new Traced();
traced.Method1();
traced.Method2();
}
}
public class Traced
{
public void Method1(String name, Int32 value) { }
public void Method2(Object object) { }
}
public class Logger
{
public static void LogStart(MethodInfo method, Object[] parameterValues);
public static void LogEnd(MethodInfo method);
}
如何在每次调用 Method1 和 Method2 的情况下调用 Logger.LogStart 和 Logger.LogEnd修改 Caller.Call 方法,而不将调用显式添加到 Traced.Method1 和 Traced.Method2?
编辑:如果允许我稍微更改 Call 方法,解决方案是什么?
【问题讨论】:
-
如果你想知道 C# 中的拦截是如何工作的,请查看Tiny Interceptor。此示例在没有任何依赖关系的情况下运行。请注意,如果您想在实际项目中使用 AOP,请不要尝试自己实现它。使用 PostSharp 等库。
-
我已经使用 MethodDecorator.Fody 库实现了方法调用的日志记录(之前和之后)。请查看github.com/Fody/MethodDecorator的库@
标签: c# reflection aop