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
和用户提供的值的函数,则需要获取方法参数计数和找出数组实际开始的位置,然后相应地包装东西。
"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
和用户提供的值的函数,则需要获取方法参数计数和找出数组实际开始的位置,然后相应地包装东西。