Как привести объект к типу, извлеченному во время выполнения - PullRequest
9 голосов
/ 26 января 2012

Я использую отражение, чтобы получить тип объекта, или для этой проблемы объект, который имеет тип свойств экземпляра, во время выполнения, а затем мне нужно изменить тип существующей переменной на этот вновь найденный тип. Это возможно? Например, следующий код не работает в строке, указанной в:

Public Sub DoSomething(x As T, y As T, exp As String)

'This is a instance property on the object of a different type
'i.e. 'T.AnotherType' We need to reflect to find out what type of object
'AnotherType is and work with it
If exp.Split(".").Count Then
  Dim tp As Type = Nothing
  tp = x.GetType
  tp = tp.GetProperty(exp.Split(".").ElementAt(0)).PropertyType()
  'Line below works, gets the right type, and now I need both x and y values passed in to be cast to this type.
  Dim typ As Type = tp.GetType
  'The line below WILL NOT work; can't cast to an unknown type at compile time - makes sense, but this is where I need a solution
  x = DirectCast(x, typ)
End If

End Sub

Я также попробовал CTypeDynamic, доступный в .NET 4.0, и подумал, я кое-что понял. Строка кода ниже фактически компилируется, но во время выполнения выдает следующую ошибку ниже.

x = CTypeDynamic(x, tp.GetType())

Недопустимое преобразование из типа «[TypeOfT]» в тип «RuntimeType».

Примечание выше, [TypeOfT] на самом деле не в сообщении об ошибке, а о типе объекта, переданного в метод.

Так есть ли вообще без Case Casements или группы операторов If TypeOf (...), которые я могу использовать тип, который я нашел во время выполнения, и динамически преобразовывать другой объект в его тип?

Спасибо! ( решение может быть в VB.NET или C # - спасибо)

1 Ответ

7 голосов
/ 26 января 2012

Попробуйте Convert.ChangeType

If exp.Split(".").Count Then
  Dim tp As Type = Nothing
  tp = x.GetType
  tp = tp.GetProperty(exp.Split(".").ElementAt(0)).PropertyType()
  'Line below works, gets the right type, and now I need both x and y values passed in to be cast to this type.
  Dim typ As Type = tp.GetType
  x = Convert.ChangeType(x, typ)
End If
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...