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

DispatchProxy.Invoke是否仅对接口方法的调用生效?

关于DispatchProxy.Invoke方法的文档准确性疑问

DispatchProxy.Create<T,TProxy>()的行为验证

静态方法DispatchProxy.Create<T,TProxy>()的官方文档说明如下:

创建一个从类TProxy派生并实现接口T的对象实例。

以下测试代码可验证这一点:

interface I{
    void Foo();
}
class D : DispatchProxy {
    protected override object Invoke(MethodInfo targetMethod, object[] args) {
        Console.WriteLine("In Invoke");
        return null;
    }
    public virtual void DMethod(){
    }
}
var proxy = DispatchProxy.Create<I,D>();
Console.WriteLine(proxy.GetType().BaseType); // typeof(D)
Console.WriteLine(proxy is I); // true

Invoke方法的文档与实际行为不符

关于Invoke方法,官方文档描述为:

每当调用生成的代理类型的任何方法时,都会调用此方法来调度控制。

通过以下代码获取代理类型的所有方法:

proxy.GetType().GetMethods(BindingFlags.NonPublic|BindingFlags.Public|BindingFlags.Instance|BindingFlags.Static).Select(x => x.Name)

得到的方法包括:Foo、Invoke、DMethod、GetType、MemberwiseClone、Finalize、ToString、Equals、GetHashCode。

但测试接口方法和DispatchProxy子类方法对Invoke的触发情况时:

proxy.Foo(); // 输出 "In Invoke"
((D)proxy).DMethod(); // 无输出

查看DispatchProxy生成代理类型的实现可知,只有可重写的方法才会生成调用Invoke的存根。即使将DMethod定义为virtual,也并未生成对应的存根。

由此产生疑问:是否文档应修改为以下描述?

每当调用生成的代理类型的接口方法时,都会调用此方法来调度控制。

内容的提问来源于stack exchange,提问作者Ivan Petrov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 17:55:00