Я думаю, что вам не хватает того факта, что методы 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
. Ничего загадочного.