2009-09-23 2 views
7

У меня есть этот документ XMLКак динамически отбрасывать объект типа строки в объект типа T

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

в моем коде, и я пытаюсь создать массив аргументов, содержащих <PublishToPdf> узел.

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

Это происходит во время компиляции, конечно. Я не могу понять, как отличить publishNode.InnerText('false') к определенному средству времени выполнения, указанному в файле XML, и хранить его в объекте (который сохранит тип).

ответ

19

Вы можете использовать Convert.ChangeType:

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

Большое спасибо, он отлично работал. – LolaRun

+0

Да, и для получения целевого типа используйте var destinationType = Type.Parse (publishNode.Attributes ["Type"]. Value); – Digitalex

+0

Type.Parse(), похоже, не существует. Вы имели в виду Type.GetType(), случайно? –

2

Вы не можете делать именно то, что вы пытаетесь сделать. Во-первых, ключевое слово typeof не позволяет проводить динамическую оценку во время выполнения. Существуют средства для этого, используя отражение, с помощью методов, таких как Type.GetType(string), но объекты Type, возвращенные из этих отражающих функций, не могут использоваться для операций, таких как литье.

Что вам нужно сделать, это предоставить средства преобразования вашего типа в строковое представление и из него. Автоматического преобразования из любого произвольного типа нет. Например, вы можете использовать bool.Parse или bool.TryParse, но они относятся к типу bool. Существуют аналогичные методы для большинства примитивных типов.

+0

Прохождение через строку сделало трюк для меня. – Slion

1

Простое решение, при условии, существует ограниченное число возможных типов;

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

Я работаю с .net framework 2.0. и у меня нет var. И решение, которое вы предложили, является фабрикой, реализующей создание объектов всех типов, которые бесчисленны. Но спасибо за вашу помощь. – LolaRun

+0

Ну, вар был просто для того, чтобы сделать код короче, и вместо этого вы можете использовать строку, строку, объект для этих трех. И, как я уже сказал, если вам нужно поддерживать только ограниченное количество типов, это будет работать нормально. Если нет, тогда вы правы, что это непрактично. – Digitalex

+1

С C# 6 вы можете использовать 'case nameof (System.Guid):' например. Больше нет необходимости в константных строках. nameof генерирует время компиляции. –

Смежные вопросы