L'analisi di un enumerazione dinamica
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
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
.