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

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top