如果我有一个委托(delegate)和一个方法
public delegate void SomeDelegate(String p);
void aMethod(String p) {
}
然后我尝试像这样在新线程上调用它
SomeDelegate sd = new SomeDelegate(aMethod());
sd.BeginInvoke("heyhey", callBack, null)
BeginInvoke 方法调用现在接受一个字符串作为第一个参数,但是,如果我从委托(delegate)和 aMethod() 中删除“String p”,BeginInvoke 现在只需要两个参数。
我如何构建一个像 BeginInvoke 这样的函数,它可以根据其他地方的代码动态接受不同类型的参数?
对不起,如果我在这里含糊不清,但我以前从未见过这个,我很好奇。
最佳答案
我认为您缺少的是 Invoke
/BeginInvoke
/EndInvoke
方法未在 上定义Delegate
- 它们由编译器自动为委托(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
的签名。没什么神秘的。
关于c# - 方法参数似乎是动态的,不确定它是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/688628/