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

Gha*_*nge 0 c# reflection

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

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)

Ser*_*rvy 5

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

method.Invoke(obj, new object[] { new[]{"param1", "param2"} });
Run Code Online (Sandbox Code Playgroud)

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