Domanda

Stiamo usando un Microsoft ERP che espone in modo dinamico i servizi web. I servizi generati dal servizio è fuori dal nostro controllo. Non abbiamo alcuna voce così nel modo in cui vengono creati e esposti gli oggetti, tra cui le definizioni del tipo,. Quando viene aggiunto o rimosso dal servizio web un nuovo metodo, tutte le enumerazioni tipo sono rinumerate e tutto ciò che utilizza il servizio web, dopo l'aggiornamento alle nuove definizioni, è hosed up. Quindi, in sostanza,

enumeration Type1
  Item1
  Item2
  Item3

... potrebbe diventare

enumeration Type6
  Item1
  Item2
  Item3

... con il nome del tipo di enumerazione che cambia, ma i membri del tipo statico rimanente. Il servizio in uscita un servizio che appare esattamente come il risultato finale di utilizzare il XSD.exe per generare oggetti. Quindi, ogni volta che qualcuno espone un nuovo metodo sul servizio (tramite l'interfaccia grafica ERP), gli oggetti vengono ricostruiti, i tipi sono assegnati alle definizioni di servizio in ordine alfabetico, reexposed, ha lasciato partire un tiro base di codice.

Ho cercato di utilizzare la reflection per determinare il tipo e quindi analizzare il membro statico nel nuovo oggetto di business, ma non funziona perché non riesco a digitare lanciare l'enumerazione senza conoscere il nome effettivo del tipo. Quanto segue non funzionerà.

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

... come il compilatore genera un errore perché non sto gettando in modo esplicito l'enumerazione.

Tutte le idee come posso superare questo problema, mentre dinamicamente getto il tipo da l'enumerazione corretta?

Anche in questo caso, non riesco a modificare gli oggetti reali esposti dal servizio, solo il codice sottoscrizione al servizio.

Grazie, George

È stato utile?

Soluzione

Re il codice di esempio:

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

Forse il modo per farlo è attraverso la riflessione:

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

Altri suggerimenti

Ho avuto un problema simile con i servizi web Nav. La soluzione che ho usato per creare un nuovo riferimento web per ogni servizio si espone attraverso Nav piuttosto che uno solo per tutti i servizi. In questo modo il nome di collisioni che si verificano senza l'utilizzo di riflessione o hack.

Perché se avete bisogno di cose parse?
Se ho capito bene enumerazioni, passano sul valore (e non l'Enum stesso).

EDIT: Quello che voglio dire è, enum non è uguale a un class. Per un class, ci si aspetta un caso per essere passato / ricevuto. Per un enum, è uno o una combinazione dei suoi componenti, che viene passato sotto forma di un valore int.

EDIT2:? Stai cercando di utilizzare il enum come una sorta di struct qui

Edit3:. Si dovrà vedere che tipo è la enum in modalità debug, per capire come riflettere su di esso

object enumValueReturned = service.BusinessObjectEnumeration;

Mettere il enumValueReturned nella finestra di controllo & play con esso utilizzando la riflessione (GetMembers) per vedere, come si dovrebbe raggiungere Item1.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top