2009-09-23 13 views
7

ho questo documento XMLcome lanciare in modo dinamico un oggetto di tipo stringa in un oggetto di tipo T

<AdditionalParameters> 
<PublishToPdf Type ="System.Boolean">False</PublishToPdf> 
</AdditionalParameters> 

nel mio codice e sto cercando di costruire una matrice di argomenti contenenti il ​​nodo <PublishToPdf>.

object test = (object) ((typeof(publishNode.Attributes["Type"].value)) publishNode.InnerText); 

Questa interruzione al momento della compilazione, naturalmente. Non riesco a capire come trasmettere il publishNode.InnerText('false') a un oggetto definito di runtime di tipo specificato nel file XML e memorizzarlo in un oggetto (che conserverà il tipo).

risposta

19

È possibile utilizzare Convert.ChangeType:

object value = Convert.ChangeType(stringValue, destinationType); 
+0

Grazie mille, ha funzionato bene. – LolaRun

+0

Sì, e per ottenere destinationType, utilizzare var destinationType = Type.Parse (publishNode.Attributes ["Type"]. Value); – Digitalex

+0

Type.Parse() non sembra esistere. Intendevi Type.GetType() per caso? –

2

Non è possibile fare esattamente ciò che si sta tentando di fare. Innanzitutto, la parola chiave typeof non consente la valutazione dinamica in fase di esecuzione. Esistono dei mezzi per eseguire questa operazione mediante la riflessione, con metodi come Type.GetType(string), ma gli oggetti Type restituiti da queste funzioni riflettenti non possono essere utilizzati per operazioni come la trasmissione.

Quello che devi fare è fornire un mezzo per convertire il tuo tipo in e da una rappresentazione di stringa. Non c'è conversione automatica da alcun tipo arbitrario. Per il tuo esempio, puoi usare bool.Parse o bool.TryParse, ma quelli sono specifici per il tipo bool. Esistono metodi simili sulla maggior parte dei tipi primitivi.

+0

Passare attraverso lo spago ha fatto il trucco per me. – Slion

1

La soluzione semplice, supponendo che non v'è un numero limitato di possibili tipi;

object GetValueObject(string type, string value) 
{ 
    switch (type) 
    { 
    case "System.Boolean": 
     return Boolean.Parse(value); 
    case "System.Int32": 
     return Int32.Parse(value); 
    ... 
    default: 
     return value; 
    } 
} 

var type = publishNode.Attributes["Type"].value; 
var value = publishNode.InnerText; 
var valueObject = GetValueObject(type, value); 
+0

sto lavorando con .net framework 2.0. e io non ho var. E la soluzione che hai suggerito è la fabbrica che implementa la creazione di oggetti di ogni tipo, che sono innumerevoli. Ma grazie comunque per il tuo aiuto. – LolaRun

+0

Bene, il var era solo per rendere il codice più breve, puoi usare stringa, stringa, oggetto per questi tre invece. E, come ho detto, se hai solo bisogno di supportare un numero limitato di tipi, questo funzionerebbe correttamente. Altrimenti, hai ragione di dire che non è pratico. – Digitalex

+1

Con C# 6 puoi usare 'case nameof (System.Guid):' per esempio. Non c'è più bisogno di stringhe costanti. nameof è generato in fase di compilazione. –

Problemi correlati