Это потому, что List(Of)
и List(Of FieldItems)
на самом деле два разных типа, точно так же, как List(Of FieldItems)
и List(Of String)
будут двумя разными типами.
Когда вы вызываете GetType(List(Of))
, он возвращает Type
представляет базовый, общий List
класс (который обычно пишется как List<T>
, где "T" является заполнителем для типа, который будет использоваться). Но свойство Fields
, которое вы ищете, имеет тип List<FieldItems>
, а не List<T>
.
Если вы измените свой код на
ElseIf _property.PropertyType = GetType(List(Of FieldItems)) Then
, то оно должно работать.
С другой стороны, если вам нужен код для работы с любым типом List<T>
, вы можете использовать Type.IsGenericType
, чтобы определить, является ли Type
универсальным типом, а затемиспользуйте Type.GetGenericTypeDefinition
, чтобы узнать, какой это универсальный тип. Например, приведенный ниже код вернул бы True
в операторе if:
(New List(Of String)).GetType.GetGenericTypeDefinition = GetType(List(Of))
Еще одно замечание: не принято объявлять ваши свойства в круглых скобках, как у вас.
Public Property Fields() As New List(Of FieldItems)
должно быть просто
Public Property Fields As New List(Of FieldItems)
Установка скобок в переменную, как в VB.NET, обычно означает, что вы объявляете массив, например: Dim foo() As String
создает массив строк. На самом деле массив не объявляется так, как вы его используете, но он вводит в заблуждение и не нужен.