System.Reflection.TargetParameterCountException, когда число параметров может быть динамическим - PullRequest
0 голосов
/ 08 октября 2018

Все методы класса «ProbabilitiesTheory» принимают динамический подсчет параметров - это означает, что в них можно поместить столько параметров, сколько нужно.Но .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 я получаю то, что мне нужно: object [], содержащий динамическое количество двойных значений.

Как мне решить эту проблему?

1 Ответ

0 голосов
/ 08 октября 2018

Что касается отражения, 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 не является единственным параметром, вам нужно получить счетчик параметров метода и выяснить, где на самом деле начинается массив, а затем обернуть вещи соответствующим образом.

...