Мне только что пришло в голову, что я, возможно, неправильно прочитал ваш вопрос. Поэтому другой ответ от меня.
Вы можете избежать необходимости приводить к универсальному типу (где вы не знаете параметр типа) во время выполнения, вводя новый интерфейс, который позволяет получить доступ к некоторому свойству Value
:
Public Interface IHasValue
Public ReadOnly Property Value As Object
End Interface
Далее убедитесь, что ваш класс DataType(Of T)
реализует этот интерфейс. Это означает, что каждый DataType(Of T)
объект (независимо от того, какой конкретный тип T
) является также IHasValue
, и вы сможете проверить это с помощью TypeOf(…) Is IHasValue
:
Public Class DataType(Of T) : Implements IHasValue
Public Value As T
Public ReadOnly Property UntypedValue As Object Implements IHasValue.Value
Get
Return Me.Value
End Get
End Property
End Class
(Такое дублирование Value
необходимо по двум причинам: во-первых, когда DataType(Of T).Value
является полем вместо свойства, а во-вторых, потому что они не имеют одинаковый тип.)
Затем, заполняя свою коллекцию полями, вы можете проверить, является ли конкретное поле DataType(Of T)
(и, если это так, развернуть из него Value
), выполнив следующее:
Dim value As Object = prop.GetValue(poco)
If TypeOf(value) Is IHasValue Then ' <- is value a DataType(Of T) ? '
value = CType(value, IHasValue).Value ' <- if so, unwrap the value '
End If
Collection.Add(prop.Name, value)
Это, вероятно, больше того, что вы ищете, чем мой другой ответ, но позвольте мне подчеркнуть это:
If TypeOf(…) Is … Then …
- это кодовый запах . Возможно, вам следует переосмыслить свой код и исследовать решения, связанные с полиморфизмом.