带有任意数量参数的c#反射方法调用

本文关键字:反射 方法 调用 参数 任意数 | 更新日期: 2023-09-27 18:03:17

试图调用具有任意数量参数的方法:

Type objType = obj.GetType();
MethodInfo method = objType.GetMethod("InvokedMethod");
method.Invoke(obj, new string[] { "param1", "param2" });

方法签名如下:

public void InvokedMethod(params string[] args) { ... } 

为什么我得到以下异常:

System.Reflection.TargetParameterCountException (Parameter count mismatch)

带有任意数量参数的c#反射方法调用

方法不接受两个参数,它只接受一个数组参数。编译器将执行转换,这样对两个字符串的方法调用将转换为对具有两个值的单个数组的调用。当使用反射时,这种转换不会为您完成。您需要显式地创建一个数组,并将两个值放入其中:

method.Invoke(obj, new object[] { new[]{"param1", "param2"} });

请记住,Invoke也不接受该参数的单个值。它接受一个包含所有参数的数组。将new string[] { "param1", "param2" }传递给Invoke是告诉Invoke您有两个参数,每个参数都是字符串。您需要将一个数组参数包装在另一个数组中,以便Invoke看到您有一个参数本身就是一个数组。

试试这个:方法。调用(obj,新对象[]{新string[]{"param1"、"param2}});

。Invoke接受一个表示整个签名的参数数组。在这种情况下,第一个参数应该是字符串数组。所以你必须传入一个对象数组,第一个元素是字符串数组