System.Reflection.TargetParameterCountException 当参数计数可以是动态的

System.Reflection.TargetParameterCountException when Parameter count can be dynamic

"ProbabilitiesTheory" class 中的所有方法都接受参数的动态计数 - 这意味着可以放置任意数量的参数。但是.NET在调用一个方法时仍然说"System.Reflection.TargetParameterCountException",它的参数中有"params"关键字。

代码如下:

internal static class ProbabilitiesTheory
{
    static public double GetMediumValue(params double[] integers)
    { }
}
class Program
{
    static void Main(string[] args)
    {
        MethodInfo[] methods = Type.GetType("ConsoleApplication1.ProbabilitiesTheory").GetMethods();

        while (true)
        {
            Console.WriteLine("Write the name of the method\n");
            string NameOfMethod = Console.ReadLine();

            Console.WriteLine("Write the parameters of the method using the following format: 
            parameter1;parameter2;parameter3;parameterN\n");
            string ParametersOfMethod = Console.ReadLine();

            foreach (var i in methods)
            {
                if (i.Name == NameOfMethod)
                {
                    object[] @parameters = (from t in ParametersOfMethod.Split(';') where t != "" select (object)Convert.ToDouble(t)).ToArray();

                    i.Invoke(null, @parameters); // Exception HERE
                }
            }
            Console.WriteLine("______");
        }
    }
}

那里的 LINQ 表达式绝对没问题,我得到了我需要得到的东西:对象 [] 包含动态数量的双精度值。

我该如何解决这个问题?

就反射而言,params array 只是一个带有奇特语法糖的数组。您可以通过像这样调整代码来解决大多数方法的直接问题:

double[] @parameters = (from t in ParametersOfMethod.Split(';') where t != "" select Convert.ToDouble(t)).ToArray();

i.Invoke(null, new[] { @parameters});

要点是 params array 只是 运行 时间的单个参数,向其添加可变数量的值的能力只是由编译器。

您可以使用如下代码段来确认这一点:

void Main()
{
    var parameterCount = typeof(Test).GetMethod("Foo").GetParameters().Count();
    Console.WriteLine(parameterCount); // Output: 2
}

// Define other methods and classes here
public static class Test 
{
    public static void Foo(double x, params double[] y) 
    {}
}

如果在 params array 不是唯一参数时需要调用使用 params array 和用户提供的值的函数,则需要获取方法参数计数和找出数组实际开始的位置,然后相应地包装东西。