Преобразование строки в другие типы

Я хочу преобразовать строку в другой тип. Проблема в том, что я знаю тип только во время выполнения. Я не хочу использовать случай Select. Есть лучший способ? Дополнительная информация: Я хочу создать форму во время выполнения. Итак, в xml у меня есть элементы управления для этой формы со всеми свойствами, которым я хочу установить значение:

 <Controls>
   <Label>
    <Text>Names</Text>
    <AutoSize>False</AutoSize>
    <Enabled>True</Enabled>
   </Label>
   <TextBox>
     <Text>Id:</Text>
     <Enabled>FALSE</Enabled>
   </TextBox>
 </Controls>

Нет, мой код:

      For Each elem As XElement In xmlDoc.Root.Element("Controls").Elements  
         Dim oType As Type
         oType = FindType("System.Windows.Forms." & elem.Name.ToString) 'FindType is a function to return the type
         Dim cnt As New Control
         cnt = Activator.CreateInstance(oType)
                For Each proper As XElement In elem.Elements
                  Dim propName As String = proper.Name.ToString
                  Dim myPropInfo As PropertyInfo = cnt.GetType().GetProperty(propName)
                    If myPropInfo IsNot Nothing Then
                        Dim val As String = proper.Value
                       ' HERE SOMETHING TO CONVERT THE STRING TO myPropInfo.PropertyType
                        ' Setting a value to the property
                        cnt.GetType().GetProperty(propName).SetValue(cnt, val, Nothing)
                    End If
                  Next
            Me.FlowLayoutPanel1.Controls.Add(cnt)
          Next

person Nianios    schedule 16.10.2012    source источник
comment
Я не хочу использовать случай Select. Почему нет?   -  person Msonic    schedule 16.10.2012
comment
Аналогичный C#: stackoverflow.com/q/811436/284240   -  person Tim Schmelter    schedule 16.10.2012
comment
Вероятно, вы можете использовать отражение, чтобы сделать это.   -  person Johnny Mopp    schedule 16.10.2012
comment
@JohnnyMopp: OP уже использует отражение, хотя я бы использовал словарь для сопоставления известных элементов управления и только для отражения неизвестных типов (см. ссылку выше).   -  person Tim Schmelter    schedule 16.10.2012


Ответы (1)


Вам нужен метод Convert.ChangeType, который получает два параметра. , строка, из которой вы конвертируете, и Type, в который вы конвертируете:

Dim val As Object = proper.Value
Dim targetProperty as PropertyInfo = cnt.GetType().GetProperty(propName)
Dim convertedVal = Convert.ChangeType(val, targetProperty.PropertyType)
targetProperty.SetValue(cnt, convertedVal, Nothing)
person Avner Shahar-Kashtan    schedule 16.10.2012
comment
Наконец, мне пришлось использовать Select Case, поскольку некоторые свойства имеют непреобразованный тип, например BorderStyle или Color для Convert.ChangeType. - person Nianios; 17.10.2012