C#中能否劫持方法调用,在目标方法执行前优先运行自定义代码?
需求实现结论
这个需求完全可以实现,属于**面向切面编程(AOP)**的典型适用场景,无需修改原有框架的业务方法代码,就能全局插入方法执行前的自定义逻辑。
推荐实现方案(Castle DynamicProxy)
这是.NET生态最常用的轻量级AOP实现,不用手写复杂的反射逻辑,开箱即用。
实现步骤
- 安装NuGet依赖包
Castle.Core - 自定义截图拦截器,实现前置执行逻辑
using Castle.DynamicProxy; public class ScreenshotInterceptor : IInterceptor { // 全局截图开关,可随时切换状态 public static bool EnableScreenshot { get; set; } = true; public void Intercept(IInvocation invocation) { // 方法执行前的截图逻辑 if (EnableScreenshot) { // 这里替换为你自己的Appium/WinAppDriver截图实现代码 Console.WriteLine($"方法[{invocation.Method.Name}]执行前完成截图"); } // 执行原有方法的业务逻辑 invocation.Proceed(); // 若需要方法执行后也截图,可在此处补充对应逻辑 } }
- 为你的框架类定义统一接口(如果已有接口可跳过这一步),原有实现类无需做任何修改:
// 框架操作统一接口 public interface IAppOperation { void Click(string elementSelector); void SendKeys(string elementSelector, string content); // 其他你的框架方法定义 } // 原有框架实现类,代码完全不变 public class AppOperation : IAppOperation { public void Click(string elementSelector) { // 原有点击逻辑 } public void SendKeys(string elementSelector, string content) { // 原有输入逻辑 } }
- 替换原有实例化逻辑,使用代理对象替代原生实例:
var proxyGenerator = new ProxyGenerator(); // 生成代理对象,全局只用替换这一处实例化逻辑 IAppOperation appOperator = proxyGenerator.CreateInterfaceProxyWithTarget<IAppOperation>( new AppOperation(), new ScreenshotInterceptor() ); // 后续调用所有方法都会自动触发前置截图逻辑 appOperator.Click("#submit"); // 关闭截图只需修改开关变量 ScreenshotInterceptor.EnableScreenshot = false; appOperator.SendKeys("#username", "test");
无第三方依赖实现方案
如果不想引入外部库,可以使用.NET 内置的 DispatchProxy 实现相同效果,只需自己实现拦截逻辑的分发即可,原理和上述方案一致。
方案优势
- 完全无侵入:原有业务方法不需要做任何修改
- 全局管控:截图开关一键切换,不需要逐个方法调整
- 扩展性强:后续要新增日志、性能监控、异常捕获等通用逻辑,只需要在拦截器中补充代码即可
内容的提问来源于stack exchange,提问作者Sara Gowen
相关产品推荐
相关产品推荐

