我认为您缺少的是 // 方法未定义的事实Invoke
-它们BeginInvoke
是由编译器为委托类型自动生成的。EndInvoke
Delegate
当您最初声明时
public delegate void SomeDelegate(String p);
编译器生成:
public class SomeDelegate : Delegate
{
public SomeDelegate(Object target, IntPtr method) { ... }
public virtual IAsyncResult BeginInvoke(string p,
AsyncCallback callback, object @object) { ... }
public virtual void EndInvoke(IAsyncResult result) { ... }
public virtual void Invoke(string p) { ... }
}
(带有适当的方法体、属性等)。
当您更改 SomeDelegate 的签名以删除参数时,生成的类型将更改为:
public class SomeDelegate : Delegate
{
public SomeDelegate(Object target, IntPtr method) { ... }
public virtual IAsyncResult BeginInvoke(
AsyncCallback callback, object @object) { ... }
public virtual void EndInvoke(IAsyncResult result) { ... }
public virtual void Invoke() { ... }
}
没有什么真正动态的 - 你改变了 的签名SomeDelegate
,这改变了 . 的签名SomeDelegate.BeginInvoke
。没什么神秘的。