Как динамически привести объект типа строка к объекту типа 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);
Другие вопросы по тегам