如何纠正参数计数不匹配

时间:2013-04-10 12:50:37

标签: c# reflection

如何纠正我遇到的错误

  

TargetParameterCountException未被用户代码处理。参数计数不匹配。

这是我正在发生的代码

public static void InvokeMethod(string className, string methodName, string fileName)
{
    var t = Type.GetType(className);
    using (StreamReader f = new StreamReader("params.txt"))
    {
        t.GetMethod(methodName).Invoke(t.GetConstructor(Type.EmptyTypes).Invoke(new object[] { }), new object[] { f.ReadLine() });
    }
}

这是整个代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.IO;

class MyClass
{
    private int i;
    public double d;
    private string s;
    public bool b;
    public MyClass()
    {
        i = 1;
        d = 0.1;
        s = "1";
        b = true;
    }
    public void Method0()
    {
        Console.WriteLine("Method with no arguments, no return value.");
    }
    private int Method1(int arg0)
    {
        Console.WriteLine("The method returns int, int gets.");
        return arg0;
    }
    private double Method2(int arg0, double arg1)
    {
        Console.WriteLine("Method returns a double, taking int and double.");
        return arg1 * arg0;
    }
    public bool Method3(string arg0)
    {
        Console.WriteLine("Method returns a bool, accepts string");
        return arg0.Length>10;
    }
    public bool Method3(string arg0,string arg1)
    {
        Console.WriteLine("The method takes two arguments string.");
        return arg0 == arg1;
    }
    public static char Method4(string arg0)
    {
        Console.WriteLine("Method returns a char, accepts string. .");
        Console.WriteLine(arg0);
        return arg0[1];
    }
    public void Method5(int arg0, double arg1)
    {
        Console.WriteLine("arg1 = {0} arg2 = {1}.",arg0,arg1);
    }
}

class MyTestClass
{
    public static string[] GetMethodsWithStrParams(string className)
    {
        var t = Type.GetType(className);
        List<string> res = new List<string>();
        foreach (var method in t.GetMethods())
        {
            foreach (var param in method.GetParameters())
            {
                if (param.ParameterType == typeof(string))
                {
                    res.Add(method.Name);
                    break;
                }
            }
        }
        return res.ToArray();
    }
    public static void InvokeMethod(string className, string methodName, string fileName)
    {
        var t = Type.GetType(className);
        using (StreamReader f = new StreamReader("params.txt"))
        {
            t.GetMethod(methodName).Invoke(t.GetConstructor(Type.EmptyTypes).Invoke(new object[] { }),
                                           new object[] { f.ReadLine() });
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        string name = "MyClass";

        foreach (var x in MyTestClass.GetMethodsWithStrParams(name))
        {
            Console.WriteLine(x);
        }

        MyTestClass.InvokeMethod("MyClass", "Method5", "params.txt");

        Console.ReadKey(true);
    }
}

2 个答案:

答案 0 :(得分:10)

您的InvokeMethod实现总是使用两个参数调用t.GetMethod(methodName).Invoke,第一个是调用该方法的目标实例,第二个是方法参数数组,它只包含一个字符串({ {1}})。

然后使用f.ReadLine()来调用InvokeMethod,它带有两个参数,一个是int和一个double。这显然不起作用,因为MyClass.Method5在语法上是不正确的,这就是有效发生的事情。您不能指望字符串是所有myClass.Method5("some string")方法的有效参数列表,可以吗?

这是错误的原因,但只有你可以决定如何解决它,因为我们不知道更大的上下文。您必须提供正确数量的参数,具体取决于所调用的实际方法。

解决方案的可能途径:

  • 我想向Method5提供哪些参数?
  • 我从哪里获取它们?
  • 如何将它们从我们提供的数组移到MyClass

这应该让你开始,但是没有人可以准确地告诉你,因为你只描述了错误,而不是你试图用你的代码解决的真正问题。

答案 1 :(得分:5)

错误不需要任何修正,这是正确的。 ;)

您正在尝试调用一个方法,该方法接受两个参数,其参数数组只包含一个项目。

适用于该特定方法的参数数组例如是:

new object[] { 0, 1.5 }

如果您希望InvokeMethod方法使用不同类型参数的方法,则必须为每个组合创建不同的参数数组。