我正在尝试构建一个使用System.ComponentModel.ISynchronizeInvoke的对象,该对象具有以下方法:(其中包括)
public object Invoke(Delegate method, object[] args)
使用给定参数调用方法的最佳方法是什么?我可以用:
public object Invoke(Delegate method, object[] args)
{
return method.DynamicInvoke(args);
}
但这已经晚了。我的直觉是,这是调用方法的唯一方法。 有什么想法吗?
答案 0 :(得分:4)
我认为这在逻辑上是不可能的。 method
委托可以封装任何签名的方法(具有任何数量和类型的参数,以及任何类型的返回值或void)。解析其签名并使用提供的参数调用它的唯一方法(在验证它们的数量和类型正确之后)将在运行时通过反射。
如果您没有实现ISynchronizeInvoke
接口并且可以定义自己的方法,那么您可以将method
参数限制为仅接受特定签名的方法委托;在这种情况下,你可以直接调用它们。
例如,要执行不带参数且具有返回值的方法,可以使用:
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);
}