Parsen eine dynamische Aufzählung
Frage
Wir sind mit einem Microsoft-ERP, die Web-Services dynamisch aussetzt. Die Leistungen des Service generiert ist außerhalb unserer Kontrolle. Wir haben nichts zu sagen, so, wie die Objekte, einschließlich der Typdefinitionen erstellt werden und ausgesetzt. Wenn eine neue Methode hinzugefügt oder aus dem Web-Dienst entfernt, alle vom Typ Aufzählungen werden neu nummerieren und alles, dass die Web-Service-Anwendungen, nach der Aktualisierung auf die neuen Definitionen wird abgespritzt werden. So im Wesentlichen,
enumeration Type1
Item1
Item2
Item3
... könnte werden
enumeration Type6
Item1
Item2
Item3
... mit dem Aufzählungstyp Namen zu ändern, aber die Mitglieder des Typs statisch bleiben. Der Dienst gibt einen Dienst, der die XSD.exe der Verwendung zu erzeugen Objekte genau wie das Endergebnis aussieht. So jemand jederzeit eine neue Methode auf den Dienst (über das ERP-GUI) aussetzt, werden die Objekte wieder aufgebaut, Typen zu den Service-Definitionen in alphabetischer Reihenfolge zugeordnet sind, erneut exponiert, die gesamte Codebasis Schuss zu verlassen.
Ich versuchte Reflexion zu verwenden, um den Typ zu bestimmen und dann das statische Element zu analysieren, in das neue Business-Objekt, aber es funktioniert nicht, weil ich nicht die Aufzählung werfen Typ kann, ohne den tatsächlichen Namen des Typs zu kennen. Im Folgenden wird nicht funktionieren.
System.Type t = service.BusinessObjectEnumeration.GetType();
service.SomeField = Enum.Parse(t,"Item1");
... als der Compiler wirft einen Fehler, weil ich ausdrücklich nicht die Aufzählung Gießen.
Irgendwelche Ideen, wie ich dieses Problem überwinden kann, während sich dynamisch den Typ auf die richtige Enumeration Gießen?
Auch hier kann ich nicht die tatsächlichen Objekte durch den Dienst ausgesetzt ändern, nur der Code in den Dienst abonnieren möchte.
Danke, George
Lösung
Re Beispielcode:
System.Type t = service.BusinessObjectEnumeration.GetType();
service.SomeField = Enum.Parse(t,"Item1");
Vielleicht ist die Art und Weise, dies zu tun ist durch Reflexion:
var prop = service.GetType().GetProperty("SomeField");
prop.SetValue(service, Enum.Parse(prop.PropertyType, "Item1"), null);
Andere Tipps
Ich hatte ein ähnliches Problem mit Nav Web-Service. Die Lösung verwendete ich für jeden Dienst eine neue Web-Verweis auf erstellen Sie durch Nav aussetzen und nicht nur eine einzige für alle Dienste. Dies verhindert die Namenskollisionen Sie erleben ohne Reflexion oder Hacks verwendet wird.
Warum sollten Sie brauchen, um Parse Dinge?
Wenn ich Aufzählungen richtig verstehen, geben sie den Wert (und nicht die Enum selbst).
EDIT: Was ich meine ist, enum
ist als class
nicht gleich. Für eine class
erwartet man eine Instanz übergeben / empfangen werden. Für eine enum
ist es eine oder Kombination seiner Mitglieder, die in Form eines int
Wert übergeben wird.
EDIT2: Wollen Sie hier die enum
als eine Art struct
verwenden
EDIT3. Sie müssen sehen, welche Art ist die enum
im Debug-Modus, um herauszufinden, wie auf sie zu reflektieren
object enumValueReturned = service.BusinessObjectEnumeration;
Setzen Sie die enumValueReturned
in Ãœberwachungsfenster & play mit ihm mithilfe von Reflektion (GetMembers
), um zu sehen, wie würden Sie Item1
erreichen.