2013-04-10 12 views
9

Come posso correggere questo errore che sto avendocome correggere la mancata corrispondenza conteggio dei parametri

TargetParameterCountException è stata gestita dal codice utente. Mancata corrispondenza del conteggio dei parametri.

Questo è il mio codice in cui sta accadendo

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

Questo è l'intero codice

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); 
    } 
} 
+0

Indovina selvaggia, ma questo è quando viene eseguito in un metodo per richiamare con più di un argomento? –

+0

Vedere questo stesso problema http://stackoverflow.com/questions/3721782/parameter-count-mismatch-with-invoke –

+0

Un paio di problemi: si prende un parametro filename per 'InvokeMethod', ma si ignora e si usano sempre" params ". testo"; 'new object [] {f.ReadLine()}' genererà sempre un array di oggetti contenente un elemento (una stringa); e stai passando un numero fisso di parametri a qualsiasi metodo tu chiami, anche se ogni metodo della tua classe prende parametri diversi. – yoozer8

risposta

10

tuo InvokeMethod attuazione richiede sempre t.GetMethod(methodName).Invoke con due argomenti, il primo essendo l'istanza di destinazione sulla quale è chiamato il metodo, e la seconda essendo la matrice di argomenti di metodo, che contiene solo una stringa (f.ReadLine()).

Quindi si utilizza InvokeMethod per chiamare MyClass.Method5 che accetta due argomenti, un int e un doppio. Questo ovviamente non può funzionare, come myClass.Method5("some string") è sintatticamente sbagliato, e questo è ciò che effettivamente accade. Non puoi aspettarti che una stringa sia un elenco di argomenti valido per tutti i metodi MyClass, puoi?

Questa è la causa dell'errore, ma solo tu puoi decidere come risolverlo, poiché non conosciamo il contesto più ampio. È necessario fornire il numero corretto di parametri in base al metodo effettivo chiamato.

possibile percorso di soluzione:

  • quali sono gli argomenti che voglio fornire a Method5?
  • da dove li ottengo?
  • come faccio a spostarli da qualsiasi luogo verso l'array assegnato a Invoke?

Questo dovrebbe iniziare, ma nessuno può dirti esattamente come hai descritto solo l'errore, ma non il vero problema che stai cercando di risolvere con il tuo codice.

+0

come posso risolvere il problema, hai ragione ma non so come posso risolverlo – trupatrue

+0

Non posso dirti che non so esattamente cosa vuoi ottenere. Non ho idea di quali argomenti siano corretti per il tuo metodo e da dove li prendi. –

+0

lasciatemi ripubblicare la domanda che spiego – trupatrue

4

L'errore non ha bisogno di alcuna correzione, è corretto. ;)

Si sta tentando di chiamare un metodo che accetta due parametri con una matrice di parametri che contiene solo un elemento.

una matrice di parametri che avrebbe funzionato per quello specifico metodo sarebbe essere, ad esempio:

new object[] { 0, 1.5 } 

Se volete che il vostro metodo di InvokeMethod di lavorare con metodi che accettano diverso numero di parametri con diversi tipi, è necessario creare diversi array di parametri per ciascuna combinazione.

+0

poiché è un esempio specifico di 'Method5', non fallirebbe con qualche errore di tipo di parametro, in quanto il secondo argomento è un doppio? –

+0

se metto method4 può leggere dal testo ma non con method5, ho provato a usare il tuo esempio ma sto ancora ricevendo l'errore di sistema – trupatrue

+0

@ZdeslavVojkovic: Sì, hai ragione, ho corretto l'esempio. – Guffa

Problemi correlati