尝试使用任意数量的参数调用方法:
Type objType = obj.GetType();
MethodInfo method = objType.GetMethod("InvokedMethod");
method.Invoke(obj, new string[] { "param1", "param2" });
Run Code Online (Sandbox Code Playgroud)
方法签名看起来像这样:
public void InvokedMethod(params string[] args) { ... }
Run Code Online (Sandbox Code Playgroud)
为什么我得到以下异常:
System.Reflection.TargetParameterCountException (Parameter count mismatch)
Run Code Online (Sandbox Code Playgroud)
该方法不接受两个参数,它接受一个数组参数.编译器将执行转换,以便将两个字符串的方法调用转换为具有两个值的单个数组的调用.使用反射时,不会为您完成这种转换.您需要显式创建一个数组并将两个值放入其中:
method.Invoke(obj, new object[] { new[]{"param1", "param2"} });
Run Code Online (Sandbox Code Playgroud)
请记住,Invoke也不接受该参数的单个值.它接受所有参数的数组.传递new string[] { "param1", "param2" }到Invoke告诉Invoke你有两个参数,每一个都是字符串.您需要将一个数组参数包装在另一个数组中,以便Invoke看到您有一个本身就是数组的参数.