Если у меня есть сложная структура, которая содержит свойства как простых, так и сложных типов, как я могу перебрать все свойства этой структуры и любые дочерние свойства, которые не являются простыми типами?
У меня есть сложный тип, называемый file, который содержит множество строковых свойств, а некоторые являются другими сложными типами, которые содержат похожие структуры, в итоге вся структура разбивается на строки.
На данный момент мой код выглядит так:
Dim file As New File
Dim props() As PropertyInfo = file.GetType.GetProperties()
_propList = New CheckBoxList
For Each prop As PropertyInfo In props
_propList.Items.Add(prop.Name)
Next
Этот код загружает мой чекбокс со всеми именами дочерних свойств моего типа файла. Что мне действительно нужно, так это список, содержащий все имена свойств, которые имеют тип string из всех сложных типов, составляющих файл.
Я очень новичок в размышлениях, поэтому я не уверен, как подойти к этому.
Обновление
Спасибо за совет. Я создал рекурсивную функцию, используя код Visual Basic, похожий на поставляемый код C #. Код теперь выглядит так:
Private Function GetStringPropertyNames(ByVal Type As System.Type) As List(Of String)
Dim props() As PropertyInfo = Type.GetProperties
Dim propList As New List(Of String)
For Each prop As PropertyInfo In props
If prop.Name <> "Chronology" And _
prop.Name <> "Documents" And _
prop.Name <> "Milestones" And _
prop.Name <> "DiaryEntries" And _
prop.Name <> "FileLoadSuccesful" And _
prop.Name <> "FileLoadError" Then
Dim boo As Boolean = False
Dim bootype As Type = boo.GetType
Dim dec As Decimal
Dim decType As Type = dec.GetType
If prop.PropertyType Is "".GetType Or _
prop.PropertyType Is Now.GetType Or _
prop.PropertyType Is bootype Or _
prop.PropertyType Is decType Then
propList.Add(prop.Name)
Else
Dim listChildPropertyStrings As List(Of String) = GetStringPropertyNames(prop.PropertyType)
For Each strProp As String In listChildPropertyStrings
propList.Add(prop.Name & ": " & strProp)
Next
End If
End If
Next
Return propList
End Function
Это работает, но это уродливо, и я совсем не доволен определенными кусками, особенно сравнениями типов, чтобы установить, являются ли это дата, строка, десятичное число или логическое значение, которые являются потенциальными низкоуровневыми типами, которые я хочу выйти.
В C # эти сравнения типов кажутся более простыми, но мне кажется, мне нужно создать экземпляр данного типа, чтобы иметь возможность использовать GetType для возврата его типа.
Есть ли другие способы очистки этого кода?