C#反射方法调用具有任意数量的参数

时间:2014-05-14 16:23:00

标签: c# reflection

尝试使用任意数量的参数调用方法:

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)

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:0)

试试这个: method.Invoke(obj,new object [] {new string [] {“param1”,“param2”}});

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