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

Rob*_*Rob 6 c# delegates invoke late-binding

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

    public object Invoke(Delegate method, object[] args)
Run Code Online (Sandbox Code Playgroud)

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

    public object Invoke(Delegate method, object[] args)
    {
        return method.DynamicInvoke(args);
    }
Run Code Online (Sandbox Code Playgroud)

但这是后期限制.我的直觉是,这是调用方法的唯一方法..任何想法?

Dou*_*las 4

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

\n\n

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

\n\n

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

\n\n
public TResult Invoke<TResult>(Func<TResult> method)\n{\n    return method();\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
public void Invoke<T1,T2,T3>(Action<T1,T2,T3> method, T1 arg1, T2 arg2, T3 arg3)\n{\n    method(arg1, arg2, arg3);\n}\n
Run Code Online (Sandbox Code Playgroud)\n