c# - 方法参数似乎是动态的,不确定它是如何工作的

标签 c# delegates dynamic-languages

如果我有一个委托(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/

相关文章:

c# - 不知道如何使用 Entity Framework 4 生成我需要的查询

Swift 泛型和协议(protocol)不适用于 UIKit [可能的错误]

c# - C# 和 Javascript 中的动态对象属性

c# - WCF REST 和 QueryString,错误的 UriTemplate?

c# - 在使用 Mono 的 Ubuntu 中运行基于 DevExpress 的 ASP.NET Web 应用程序时出错

C# 监视器(来自 Java 开发人员的 POV)

ios - 从 ViewController 访问编程 View ?

iphone - 如何从 UINavigationController 堆栈上已有的 UIViewController 调用方法

c# - 是否有一种语言同时允许静态和动态类型?

domain-driven-design - 动态语言中的领域驱动设计工作?