Отражение Рекурсивно через объект со списком (из) - PullRequest
0 голосов
/ 19 октября 2019

Желая использовать Reflection, чтобы получить имя объекта и значение. Я могу пройти через класс DocumentConfig, но не могу получить поля. Также не хочет идентифицировать gettype как список (из). Если принудительное возвращение в список (of) возвращает сообщение fielditems не является членом класса DocumentConfig.

Public Class MyDocuments
Public Class DocumentConfig
    Private _Name As String
    Public Property Name() As String
    Public Property Fields() As New List(Of FieldItems)
End Class
Public Class FieldItems
    Private _Name As String
    Public Property Name() As String
End Class
End Class

Module Module1
Sub Main()
    Dim Document As New List(Of FieldItems)
    Document.Add(New FieldItems With {.Name = "Invoice"})
    Document.Add(New FieldItems With {.Name = "Statement"})
    Document.Add(New FieldItems With {.Name = "Reminder"})
End Sub
Public Sub DisplayAll(ByVal Someobject As DocumentConfig)
        Dim _type As Type = Someobject.GetType()
        Console.WriteLine(_type.ToString())
        Dim flags As BindingFlags = BindingFlags.Public Or BindingFlags.Instance
        Dim properties() As PropertyInfo = _type.GetProperties(flags)
        For Each _property As PropertyInfo In properties
            Dim valuetype = _property.GetType()
            If [_property].PropertyType = GetType(String) OrElse [_property].PropertyType = GetType(Integer) OrElse [_property].PropertyType = GetType(Boolean) then
                Console.WriteLine("Name: " + _property.Name + ", Value: " + _property.GetValue(Someobject, Nothing))
            ElseIf _property.PropertyType = GetType(List(Of)) Then
                Dim list = [_property].GetValue(Someobject, Nothing)
                For Each item In list
                    DisplayAll(item)
                Next
            Else
                Console.WriteLine("Name: " + _property.Name)
            End If
        Next
    End Sub
End Module

1 Ответ

0 голосов
/ 20 октября 2019

Это потому, что 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 создает массив строк. На самом деле массив не объявляется так, как вы его используете, но он вводит в заблуждение и не нужен.

...