2016-07-11 13 views
0

Ich hatte zuvor ein Problem mit der Verwendung von Reflexion, die Sie sehen können here.Reflection zu finden Methode durch Name und returntype

Nachdem ich eine Antwort auf die Frage erhalten und versucht habe, sie in mein Projekt zu implementieren, habe ich eine weitere Wand getroffen.

Im Prinzip habe ich diesen Code:

String[] arr = {"", conStr, ""}; 
      var myType = (typeof(JaberoDC.JaberoDC.JaberoDC)); 


      var method = myType.GetMethods(param, BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly).Single(mi => mi.ReturnType == typeof(DataSet)); 
      var subject = Activator.CreateInstance(myType); 
      var result = method.Invoke(subject, arr); 


      DataSet ds = (DataSet)result; 

Wo param ist ein String.

Es scheint jedoch nicht wie vorgesehen zu funktionieren.

Die Linie

var method = myType.GetMethods (param, BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly) .Single(mi => mi.ReturnType == typeof(DataSet)); 

führt den Fehler

Unkown method GetMethods(string, System.Reflection.BindingFlags) of System.Type

Und

mi => mi.ReturnType == typeof(DataSet)); 

diesen Fehler Würfe:

Unkown type of variable mi

Könnte mir jemand bei der korrekten Initialisierung meiner Methode Variable helfen. Ich habe mich bei Google umgeschaut, um zu sehen, ob ich möglicherweise etwas finden kann, das mich zumindest in die richtige Richtung weist. Mein vorheriger Code (wieder, siehe other question) kompiliert und lief, aber warf einen mehrdeutigen Treffer gefunden Fehler.

EDIT:

meinen Code geändert mehr wie die Antwort unten zu sein. Aber ich erhalte eine Fehlermeldung bei Debuggen es:

targetparametercountexception parameter count mismatch

, die auf dieser Linie passiert:

var result = method.Invoke(subject, arr); 

Aus der Lektüre über Reflexion Online scheint es, wie Sie in einer Reihe von Parametern übergeben werden sollen, dass Die Methode, die Sie aufrufen, benötigt (in meinem Fall das Array). In einer anderen Klasse verwende ich diese (was absolut in Ordnung funktioniert, ich bin versucht, die genau die gleiche Methode aufzurufen):

DataSet ds = jdc.FETCHvw_WorksiteEntry("", conStr, ""); 

Ende EDIT1.

+0

wo kommt 'param' kommt in Ihrem Code? Es ist nirgendwo in Ihrem Beispiel angezeigt –

+0

Können Sie die Methode, die Sie versuchen, durch Reflexion aufrufen? – user3185569

+0

Ich kann keine Überladung von Type.GetMethods finden, die zwei Argumente empfängt. https: // msdn. microsoft.com/en-us/library/4d848zkb(v=vs.110).aspx – m1o2

Antwort

0

Das macht, was Sie versuchen, aber ich denke nicht, dass es das ist, was Sie wollen.

var method = myType.GetMethods(
    BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly) 
    .Single(mi => 
     mi.ReturnType == typeof(DataSet) 
     && string.Equals(mi.Name, param, StringComparison.OrdinalIgnoreCase)); 

Diese bekommt man ein Verfahren, und Sie wissen, dass es eine DataSet gibt, aber es gibt keine Garantie, dass Sie es mit dem Argument aufrufen kann (s) Sie haben.

Dies wäre besser:

var method = myType.GetMethod(param, 
     BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly, 
     null, new Type[] {typeof (string)}, null); 

Wo das Array {typeof(string)} ein Array der Parametertypen ist die Methode empfängt. Auf diese Weise suchen Sie genau nach der gewünschten Methode, nicht nur nach einer Methode mit dem richtigen Rückgabetyp.

(ich war nicht klar, was die Argumente für die Methode. Wenn es dann zwei Strings ist würde die new Type[] {typeof (string), typeof(string)} sein. Wenn es ein Array von Strings ist dann new Type[] {typeof (string[])}.

+0

Das sieht gut aus. Bei der Verwendung scheint mir jedoch ein Fehler in den Ergebnissen zu kommen. Ich werde eine Bearbeitung hinzufügen, um es so gut wie möglich zu erklären. – geostocker