Laden...

Typ temporär zur Laufzeit erstellen

Erstellt von inflames2k vor 7 Jahren Letzter Beitrag vor 7 Jahren 1.731 Views
inflames2k Themenstarter:in
2.298 Beiträge seit 2010
vor 7 Jahren
Typ temporär zur Laufzeit erstellen

Hallo,

ich schreibe derzeit eine Anwendung die als "generische" Testanwendung für Soap-Webservices dienen soll.

Nach Eingabe der Url, soll die Methode auswählbar sein und anschließend soll eine Eingabemaske für die Parameter angezeigt werden.

Da einige Webservices auch komplexe Typen verwenden, möchte ich aus den Parameterinformationen "dynamisch" zur Laufzeit eine Klasse erstellen. Wie kann ich dafür vorgehen? Mein Ziel ist es am Ende, die Eingaben über ein PropertyGrid zu erlauben.

Das Ermitteln der komplexen Typen sowie Parameter des Webservices habe ich bereits. Für jeden komplexen Typen halte ich den Namen, sowie die Properties (Name und Typ).

Am Beispiel von folgendem sei gezeigt, wie ich die Informationen vorliegen habe.


Typname
      Property
           Name
           Typ (als string)
      ...

Ich möchte hier vermeiden temporär eine DLL zu kompilieren. Ich hoffe mein Problem ist klar ausgedrückt.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

P
1.090 Beiträge seit 2011
vor 7 Jahren

Könnte mit Dynamic Objekt und es an ein Grid zubinden funktioniern.

MSDNForum:Bind dynamically created properties to a grid

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

W
872 Beiträge seit 2005
vor 7 Jahren

Du könntest auch mit Reflection.Emit arbeiten.

6.911 Beiträge seit 2009
vor 7 Jahren

Hallo inflames2k,

ich würde es wie weismat vorgeschlagen hat umsetzen. (Falls dir aber die IL-Opcodes nicht so geheuer und Expression-Trees lieber sind, so kannst du mit denen den passenden Delegaten erzeugen.

Du könntest auch ein Mocking-Framework wie z.B. Moq verwenden und dort die Expression-Trees und Ergebnisse einschleußen.

Edit: habs noch einmal gelesen und ich denke das mit den Expression passt nicht, da ich das auf die Erstellung der Methoden bezogen habe und dir geht es ja um die Argumente für die Methode. Ein Ansatz via Deserialisierung müsste hier klappen.

Noch als ganz andere Idee: Wenn du WCF verwendest, so könntest du dich direkt in die Kommunikation einhaken und die (serialisierten) Parameter-Werte direkt "in die Leitung" schreiben. Dann entfällt der gesamte Aufwand zum dynamischen Erstellen der Klasse.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

T
708 Beiträge seit 2008
vor 7 Jahren

Hallo inflames2k,

kennst Du WebServiceStudio? Das löst, genau wie SoapUI, einen Webservice in alle Methoden und Parameter auf.
Nur mit dem Unterschied zu SoapUI, dass der Quelltext von WebServiceStudio vorliegt 😃

Vielleicht kannst Du Dir dort ein paar Anleihen für Deine Umsetzung holen.

inflames2k Themenstarter:in
2.298 Beiträge seit 2010
vor 7 Jahren

Hallo inflames2k,

kennst Du
>
? Das löst, genau wie SoapUI, einen Webservice in alle Methoden und Parameter auf.

Muss ich mir mal ansehen. - Was ich jedoch direkt im Test gemerkt habe, ist das komplexe Typen für das Programm auch keine leichte Aufgabe sind. - Bei Auswahl einer Methode mit komplexen Typen bekam ich direkt eine System.Reflection.TargetParameterCountException. Aber eventuell kann ich ja etwas finden, das mir weiterhilft im Code von dem Programm.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

1.029 Beiträge seit 2010
vor 7 Jahren

Hi,

was spricht dagegen eine neue C#-Assembly mit Roslyn zu kompilieren?

Die WebServices um die es hier geht klingen spontan noch größeren Services, womit es sich durchaus lohnen könnte eine Assembly und diverse Metadaten zusammenzupacken um diese jederzeit wieder benutzen zu können...

LG