You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中能否劫持方法调用,在目标方法执行前优先运行自定义代码?

需求实现结论

这个需求完全可以实现,属于**面向切面编程(AOP)**的典型适用场景,无需修改原有框架的业务方法代码,就能全局插入方法执行前的自定义逻辑。

推荐实现方案(Castle DynamicProxy)

这是.NET生态最常用的轻量级AOP实现,不用手写复杂的反射逻辑,开箱即用。

实现步骤

  1. 安装NuGet依赖包 Castle.Core
  2. 自定义截图拦截器,实现前置执行逻辑
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();

        // 若需要方法执行后也截图,可在此处补充对应逻辑
    }
}
  1. 为你的框架类定义统一接口(如果已有接口可跳过这一步),原有实现类无需做任何修改:
// 框架操作统一接口
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)
    {
        // 原有输入逻辑
    }
}
  1. 替换原有实例化逻辑,使用代理对象替代原生实例:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 05:06:02