2010-06-21 5 views
3

Nous utilisons un ERP Microsoft qui expose dynamiquement les services Web. Les services générés par le service sont hors de notre contrôle. Nous n'avons aucun mot à 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ées et tout ce qui utilise le service Web, après la mise à jour vers les nouvelles définitions, est compressé. Donc, essentiellement,Analyse d'une énumération dynamique

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 génère un service qui ressemble exactement au résultat final de l'utilisation de XSD.exe pour générer des objets. Ainsi, à chaque fois que quelqu'un expose une nouvelle méthode sur le service (via l'interface graphique ERP), les objets sont reconstruits, les types sont assignés aux définitions de service dans l'ordre alphabétique, réexposés, laissant toute la base de code. J'ai essayé d'utiliser la réflexion pour déterminer le type, puis analyser le membre statique dans le nouvel objet métier, mais cela ne fonctionne pas car je ne peux pas taper 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 renvoie une erreur car je ne lance pas explicitement l'énumération.

Des idées comment je peux surmonter ce problème tout en coulant dynamiquement le type à l'énumération correcte?

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

Merci, George

Répondre

7

Re l'exemple de code:

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

Peut-être que 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); 
+0

Je suppose qu'utiliser la réflexion à la fois pour récupérer la valeur et définir la propriété est la seule façon disponible, étant donné les contraintes OP. Bien sûr, cela signifie que même les méthodes qui utilisent une telle énumération en tant que paramètre doivent être appelées en utilisant la réflexion (puisqu'il s'agit de types de paramètres de régression agnostiques) ... – BladeWise

0

Pourquoi vous avez besoin d'analyser les choses?
Si je comprends correctement les Enums, ils transmettent la valeur (et non l'Enum lui-même).

EDIT: Ce que je veux dire, enum n'est pas identique à class. Pour un class, on s'attend à ce qu'une instance soit passée/reçue. Pour un enum, il s'agit d'un ou d'une combinaison de ses membres, qui est passé sous la forme d'une valeur int.

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

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

object enumValueReturned = service.BusinessObjectEnumeration; 

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

+0

-1 Il existe un certain nombre de raisons pour lesquelles vous pourriez avoir besoin du nom ou de la valeur de chaîne de l'énumération, par ex. peut-être qu'une sérialisation XML a sauvegardé les valeurs des chaînes, peut-être qu'elles servent à remplir une liste déroulante, etc., et que vous voulez conserver le nom de l'énumération si une nouvelle valeur est ajoutée au milieu. Toutes ces utilisations peuvent ne pas être les plus intelligentes des pratiques, mais ce sont néanmoins des pratiques. – SWeko

+0

@Sweko: Comment les valeurs enum sont-elles passées depuis le webservice? Passe-t-il les métadonnées entières d'une énumération avec la valeur réelle? Je veux dire, quel est le but d'un Énum, quand vous cherchez l'un de ses membres? – shahkalpesh

+0

La méta-donnée Enum est générée sur le client lorsque le service Web est référencé, puis, lors de l'exécution, cette métadonnée est utilisée dans les appels de requête/réponse. Et je suis d'accord, int sont beaucoup plus portable pour l'utilisation du service web, mais le PO n'a pas le contrôle sur le service. – SWeko

1

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