13

このエラーを修正するにはどうすればよいですか

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);
    }
}
4

2 に答える 2

14

実装InvokeMethodでは常にt.GetMethod(methodName).Invoke2 つの引数を使用して呼び出します。1 つ目はメソッドが呼び出されるターゲット インスタンスで、2 つ目はメソッド引数の配列で、1 つの文字列 ( ) のみを含みますf.ReadLine()

次に、int と double の 2 つの引数を取るInvokeMethodcall を使用します。MyClass.Method5構文的に正しくないため、これは明らかに機能しませんmyClass.Method5("some string")。これが実際に起こることです。文字列がすべてのメソッドの有効な引数リストであるとは期待できませんMyClassよね?

それがエラーの原因ですが、より大きなコンテキストがわからないため、修正方法を決定できるのはあなただけです。呼び出される実際のメソッドに応じて、正しい数のパラメーターを指定する必要があります。

解決策への可能なパス:

  • Method5 に提供したい引数は何ですか?
  • どこから入手できますか?
  • それらをどこからでも私が与える配列に移動するにはどうすればよい Invokeですか?

これで始められるはずですが、エラーを説明しただけで、コードで解決しようとしている実際の問題を説明していないため、誰も正確に言うことはできません.

于 2013-04-10T12:56:19.667 に答える
5

エラーは修正する必要はありません。正しいです。;)

1 つの項目のみを含むパラメーターの配列で 2 つのパラメーターを受け取るメソッドを呼び出そうとしています。

その特定のメソッドで機能するパラメーター配列は、たとえば次のようになります。

new object[] { 0, 1.5 }

InvokeMethod異なる型の異なる数のパラメータを取るメソッドでメソッドを動作させたい場合は、組み合わせごとに異なるパラメータ配列を作成する必要があります。

于 2013-04-10T12:55:52.900 に答える