Question

Nous utilisons un ERP Microsoft qui expose de façon dynamique des services Web. Les services générés par le service est hors de notre contrôle. Nous n'avons pas le dire dans la façon dont les objets, y compris les définitions de type, sont créés et exposés. Lorsqu'une nouvelle méthode est ajoutée ou supprimée du service Web, toutes les énumérations de type sont renumérotés et tout ce qui utilise le service Web, après la mise à jour des nouvelles définitions, est lavé au jet vers le haut. Donc, essentiellement,

enumeration Type1
  Item1
  Item2
  Item3

... pourrait devenir

enumeration Type6
  Item1
  Item2
  Item3

... avec le nom du type d'énumération changeant, mais les membres du type restant statique. Le service dispose d'un service qui ressemble exactement le résultat final de l'utilisation du XSD.exe pour générer des objets. Ainsi, une personne à tout moment expose une nouvelle méthode sur le service (via l'interface ERP), les objets sont reconstruits, les types sont affectés aux définitions de service dans l'ordre alphabétique, réexposés, laissant tout le plan de base de code.

Je tenté d'utiliser la réflexion pour déterminer le type et analyser le membre statique dans le nouvel objet métier, mais il ne fonctionne pas parce que je ne peux pas taper jeter l'énumération sans connaître le nom réel du type. Ce qui suit ne fonctionnera pas.

System.Type t = service.BusinessObjectEnumeration.GetType();
service.SomeField = Enum.Parse(t,"Item1");

... comme le compilateur génère une erreur parce que je ne suis pas explicitement coulée l'énumération.

Toutes les idées comment je peux surmonter ce problème en jetant dynamiquement le type à l'énumération correcte?

Encore une fois, je ne peux pas modifier les objets réels exposés par le service, seul le code abonnement au service.

Merci, George

Était-ce utile?

La solution

Re le code exemple:

System.Type t = service.BusinessObjectEnumeration.GetType();
service.SomeField = Enum.Parse(t,"Item1");

Peut-être la façon de le faire est par réflexion:

var prop = service.GetType().GetProperty("SomeField");
prop.SetValue(service, Enum.Parse(prop.PropertyType, "Item1"), null);

Autres conseils

J'ai eu un problème similaire avec Nav services Web. La solution que j'utilisé pour créer une nouvelle référence Web pour chaque service que vous présentez par Nav plutôt qu'un seul pour tous les services. Cela permet d'éviter les collisions de noms que vous rencontrez sans utiliser la réflexion ou hacks.

Pourquoi devriez-vous besoin d'analyser les choses?
Si je comprends énumérations correctement, ils passent sur la valeur (et non l'Enum lui-même).

EDIT: Ce que je veux dire est, enum n'est pas identique à un class. Pour une class, on attend une instance à transmettre / reçu. Pour un enum, il est l'un ou une combinaison de ses membres, qui est transmis sous la forme d'une valeur de int.

EDIT2: Essayez-vous d'utiliser le enum comme une sorte de struct ici

EDIT3. Vous devez voir quel type est le enum en mode débogage, pour savoir comment réfléchir

object enumValueReturned = service.BusinessObjectEnumeration;

Mettre la enumValueReturned dans la fenêtre montre et jeu avec l'aide de la réflexion (GetMembers) pour voir, comment voulez-vous atteindre Item1.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top