c# - 在 C# 中调用 System.Delegate 类对象

标签 c# delegates invoke late-binding

我正在尝试构建一个使用 System.ComponentModel.ISynchronizeInvoke 的对象,它具有以下方法:(以及其他方法)

    public object Invoke(Delegate method, object[] args)

使用给定参数调用方法的最佳方式是什么?我可以使用:

    public object Invoke(Delegate method, object[] args)
    {
        return method.DynamicInvoke(args);
    }

但这是后期绑定(bind)。我的直觉是,这是调用该方法的唯一方法。 有什么想法吗?

最佳答案

我认为它在逻辑上不可能是任何其他方式。 method 委托(delegate)可以封装任何签名的方法(具有任何数量和类型的参数,以及任何类型的返回值或 void)。解析其签名并使用提供的参数调用它(在验证它们的数量和类型正确之后)的唯一方法是在运行时通过反射。

如果您没有实现 ISynchronizeInvoke 接口(interface)并且可以定义您自己的方法,那么您可以将您的 method 参数限制为仅接受特定签名的方法委托(delegate);在这种情况下,您可以直接调用它们。

例如,要执行不带参数但有返回值的方法,您可以使用:

public TResult Invoke<TResult>(Func<TResult> method)
{
    return method();
}

要执行一个采用三个参数且没有返回值的方法,您可以使用:

public void Invoke<T1,T2,T3>(Action<T1,T2,T3> method, T1 arg1, T2 arg2, T3 arg3)
{
    method(arg1, arg2, arg3);
}

关于c# - 在 C# 中调用 System.Delegate 类对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10566604/

相关文章:

c# - Form.show() 从另一个线程中的事件开始

c# - 确定 App 是否作为 'clickonce' 应用程序运行

c# - 循环(可选)方法参数

javascript - 正则表达式 - 无限错误是什么意思?

c# - 跨线程读取值不重要的变量

c# - C#中的简单组合是什么

c++ - C++ 中的委托(delegate)

c# - 委托(delegate)的目的

java - 在java应用程序中使用黑莓相机选择已存档的照片

Java调用API : Call the C function back from the java code