2009-09-23 13 views
7

ich dieses XML-DokumentWie dynamisch ein Objekt vom Typ String in ein Objekt vom Typ T

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

in meinem Code und ich versuche haben zu werfen eine Reihe von Argumenten, die <PublishToPdf> Knoten zu bauen.

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

Dies bricht natürlich zur Kompilierzeit. Ich kann nicht herausfinden, wie das publishNode.InnerText('false') zu einem Laufzeit definierten Objekt des in der XML-Datei angegebenen Typs umgewandelt und in einem Objekt gespeichert wird (wodurch der Typ erhalten bleibt).

Antwort

19

können Sie Convert.ChangeType verwenden:

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

Vielen Dank, es hat gut funktioniert. – LolaRun

+0

Ja, und um den Zieltyp zu erhalten, verwenden Sie var destinationType = Type.Parse (publishNode.Attributes ["Type"]. Value); – Digitalex

+0

Type.Parse() scheint nicht zu existieren. Meintest Du Type.GetType() zufällig? –

2

Sie können nicht genau das tun, was Sie tun möchten. Erstens erlaubt das Schlüsselwort typeof keine dynamische Auswertung zur Laufzeit. Es gibt Mittel, um dies unter Verwendung von Reflektion mit Methoden wie Type.GetType(string) zu tun, aber die Objekte Type, die von diesen reflektierenden Funktionen zurückgegeben werden, können nicht für Vorgänge wie Gießen verwendet werden.

Was Sie tun müssen, ist eine Möglichkeit, Ihren Typ in und aus einer Zeichenfolgendarstellung zu konvertieren. Es gibt keine automatische Konvertierung von einem beliebigen Typ. In Ihrem Beispiel können Sie bool.Parse oder bool.TryParse verwenden, aber diese sind spezifisch für den Typ bool. Es gibt ähnliche Methoden für die meisten primitiven Typen.

+0

Das Durchlaufen der Schnur machte den Trick für mich. – Slion

1

Die einfache Lösung, vorausgesetzt, es gibt eine begrenzte Anzahl von möglichen Typen;

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

Ich arbeite mit .net Framework 2.0. und ich habe nicht var. Und die Lösung, die Sie vorgeschlagen haben, ist die Fabrik, die die Schaffung von Objekten aller Art implementiert, die unzählige sind. Aber danke für Ihre Hilfe trotzdem. – LolaRun

+0

Nun, die Var war nur, um den Code kürzer zu machen, können Sie String, String, Objekt für diese drei stattdessen verwenden. Und, wie gesagt, wenn Sie nur eine begrenzte Anzahl von Typen unterstützen müssen, würde das gut funktionieren. Wenn nicht, dann hast du recht zu sagen, dass es nicht praktikabel ist. – Digitalex

+1

Mit C# 6 können Sie 'case nameof (System.Guid):' zum Beispiel verwenden. Keine Notwendigkeit für Const Strings mehr. nameof ist Kompilierzeit generiert. –

Verwandte Themen