Как динамически привести объект типа строка к объекту типа T
У меня есть этот документ XML
<AdditionalParameters>
<PublishToPdf Type ="System.Boolean">False</PublishToPdf>
</AdditionalParameters>
в моем коде, и я пытаюсь построить массив аргументов, содержащих <PublishToPdf>
узел.
object test = (object) ((typeof(publishNode.Attributes["Type"].value)) publishNode.InnerText);
Конечно, это нарушается во время компиляции. Я не могу понять, как разыграть publishNode.InnerText('false')
к определенному во время выполнения объекту типа, указанному в файле XML, и сохраните его в объекте (который будет сохранять тип).
3 ответа
Ты можешь использовать Convert.ChangeType
:
object value = Convert.ChangeType(stringValue, destinationType);
Вы не можете сделать именно то, что вы пытаетесь сделать. Во-первых, typeof
Ключевое слово не позволяет динамическую оценку во время выполнения. Есть средства, с помощью которых можно сделать это с помощью рефлексии Type.GetType(string)
, но Type
объекты, возвращаемые из этих отражающих функций, нельзя использовать для таких операций, как приведение типов.
Что вам нужно сделать, это предоставить средства для преобразования вашего типа в и из строкового представления. Там нет автоматического преобразования из любого произвольного типа. Для вашего примера вы можете использовать bool.Parse
или же bool.TryParse
, но они специфичны для bool
тип. Есть похожие методы на большинстве примитивных типов.
Простое решение, при условии, что существует ограниченное количество возможных типов;
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);