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

Castle.DynamicProxy:无接口类用CreateClassProxyWithTarget拦截器不生效

解决Castle.DynamicProxy拦截无接口类失效的问题

问题根源

Castle.DynamicProxy实现类代理的核心逻辑是生成目标类的子类,通过重写方法注入拦截逻辑。如果目标类的方法没有用virtual修饰,子类无法重写该方法,拦截器的代码自然不会被触发。你的SampleClass中Method1和Method2都是非virtual方法,所以不管用CreateClassProxy还是CreateClassProxyWithTarget都无法生效。

可行解决方案

方案1:给目标方法添加virtual修饰符

直接修改遗留类的方法,加上virtual关键字,让代理子类能重写方法触发拦截:

public class SampleClass : ISampleClass
{
    public virtual void Method1()
    {
        Console.WriteLine("Executing Method 1...");
    }
    public virtual void Method2()
    {
        Console.WriteLine("Executing Method 2...");
    }
}

之后两种类代理方式都能正常工作:

// 直接创建类代理实例
var sampleClass = generator.CreateClassProxy<SampleClass>(interceptor);
// 基于已有实例创建代理
var sampleClass = generator.CreateClassProxyWithTarget(new SampleClass(), interceptor);

方案2:使用Mix-in特性(无需修改原有类)

如果完全不想改动遗留类代码,可以通过Mix-in给代理类附加一个接口,拦截该接口的方法调用:

// 定义包含目标方法的接口
public interface ISampleMethods
{
    void Method1();
    void Method2();
}

// 创建代理时附加该接口
var sampleClass = generator.CreateClassProxyWithTarget<SampleClass, ISampleMethods>(new SampleClass(), interceptor);
// 必须通过接口类型调用才能触发拦截
((ISampleMethods)sampleClass).Method1();
((ISampleMethods)sampleClass).Method2();

验证效果

修改后运行代码,拦截器会正常执行,输出如下:

Executing Method 1...
Method Method1.
Executing Method 2...
Method Method2.

内容的提问来源于stack exchange,提问作者Vitaly Filatenko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 19:05:04