2012-04-03 12 views
0

I Klassennamen haben, die im String-Format ist, muss ich dynamisch ausführen funktionieren und Guss führen in dynamischwie String generische Art zu werfen

Type type = Type.GetType(method.NameSpace + "." + method.ClassName, false); 
    // 

     Type calledType = Type.GetType(namespaceName + "." + className + "," + assemblyName); 
      //this function return object type of class type which is I've created from string className  
var result= calledType.InvokeMember(
           methodName, 
           BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static, 
           null, 
           null, 
           obj); 

oder alternativ dazu

public T CAST<T>(Object o){ 
//some mechanism 
} 

CAST<type >(result); 

gibt Typ oder Namespacename erwartet .. Wie kann ich dynamisch generierte Klassenart in den generischen Typ konvertieren

Jetzt muss ich var-Ergebnis zu einem Type-Typ (dynamische Klasse) umwandeln . Wie?

+5

* Warum * musst du diese Besetzung machen? Bitte geben Sie uns das größere Bild. –

+0

Und was ist die Zeichenfolge, die Sie werfen möchten? Die Art des Ergebnisses ist "Objekt", nicht "Zeichenfolge". – hvd

+0

Nun, ich habe Methode dynamisch von der neuen hinzugefügten Assembly im System ausführen. So Alle Methoden Liste und die erforderlichen Informationen in der Datenbank gespeichert und von Datenbankfeld muß ich ausführen und aus dieser Funktion führen zu bekommen wie wir schwer in Codedatei codiert haben, ich habe versucht, var result = (Typ) calledType.InvokeMember ( zu tun methoden, BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static, null, null , obj); aber das gibt Fehler, wie es –

Antwort

0

Ich denke, was Sie brauchen Convert.ChangeType ist. Nachfolgend finden Sie eine Proben für MyMethod mit string[] Parameter aufgerufen wird.

public static string MyMethod(string s, int i, DateTime d) 
{ 
    return s + " " + i + " " + d.ToString(); 
} 

public T Execute<T>() 
{ 
    //They are all strings in object array 
    object[] myparams = new object[] {"test","3","04/03/2012" }; 

    Type[] types = this.GetType() 
         .GetMethod("MyMethod") 
         .GetParameters() 
         .Select(p=>p.ParameterType) 
         .ToArray(); 

    object result = 
     this.GetType().InvokeMember(
     "MyMethod", 
     BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static, 
     null, 
     this, 
     myparams.Select((s,i)=>Convert.ChangeType(s,types[i])).ToArray() 
     ); 

    return (T)result; 
} 
+0

in Ihrem Fall tun MyMethod einen String und Parametertyp Rückkehr ist auch string, int usw., aber was ist, wenn MyMethod Rückgabeliste von Objekt und Parameter sind auch Objekttyp müssen i Parameter werfen und Typen zurückgeben auch und dynamisch .... so was ich will, ist var Ergebnis zu Typ von früher aus String-Klassennamen erstellt .. ist das nicht möglich? –

+0

'Ich muss Parameter und Rückgabetyp zu werfen 'Dies ist auch, was ich in der Antwort tue. 'MyMethod's Parameter sind * int *, * string * & * Datetime *,' myparams' auf der anderen Seite, ist String-Array –

+0

In Ihrem Fall params sind in String-Array, aber in meinem Fall gibt es eine Menge Objekt und List-Objekt kommen als params und ich muss sie filtern und es als params irgendwelche Anhaltspunkte geben? Ich möchte wie public T CAST (Objekt o) { // einige Mechanismus } Filter und out die reuired param CAST (Ergebnis); –

Verwandte Themen