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
相关产品推荐
相关产品推荐

