为了通过另一个线程更改控件,我需要调用一个委托来更改控件但是,它正在抛出一个TargetParameterCountException
:
private void MethodParamIsObjectArray(object[] o) {}
private void MethodParamIsIntArray(int[] o) {}
private void button1_Click(object sender, EventArgs e)
{
// This will throw a System.Reflection.TargetParameterCountException exception
Invoke(new Action<object[]>(MethodParamIsObjectArray), new object[] { });
// It works
Invoke(new Action<int[]>(MethodParamIsIntArray), new int[] { });
}
为什么用MethodParamIsObjectArray
调用会引发异常?
答案 0 :(得分:4)
这是因为Invoke
方法的签名为:
object Invoke(Delegate method, params object[] args)
params
参数前面的args
关键字表示此方法可以将可变数量的对象作为参数。提供对象数组时,它在功能上等同于传递多个以逗号分隔的对象。以下两行在功能上是等效的:
Invoke(new Action<object[]>(MethodParamIsObjectArray), new object[] { 3, "test" });
Invoke(new Action<object[]>(MethodParamIsObjectArray), 3, "test");
将对象数组传递到Invoke
的正确方法是将数组转换为Object
类型:
Invoke(new Action<object[]>(MethodParamIsObjectArray), (object)new object[] { 3, "test" });
答案 1 :(得分:0)
Invoke需要一个包含参数值的对象数组。
在第一次通话中,您不提供任何值。您需要一个值,这可能令人困惑地需要成为一个对象数组本身。
new object[] { new object[] { } }
在第二种情况下,您需要一个包含整数数组的对象数组。
new object[] { new int[] { } }