Перебор всех свойств данного типа в .NET - PullRequest
1 голос
/ 19 июня 2009

Если у меня есть сложная структура, которая содержит свойства как простых, так и сложных типов, как я могу перебрать все свойства этой структуры и любые дочерние свойства, которые не являются простыми типами?

У меня есть сложный тип, называемый 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 для возврата его типа.

Есть ли другие способы очистки этого кода?

Ответы [ 2 ]

5 голосов
/ 19 июня 2009

Вы на правильном пути, Чарльз, просто помните: "рекурсивность".

Поскольку вы жаловались на "уродство" сравнения типов в VB.NET, просто помните, что вы также можете сравнитьтип как:

If TypeOf obj Is GetType(DataType) Then

Так же, как вы сделали бы в C #.

2 голосов
/ 19 июня 2009

Попробуйте что-то вроде этого:

public static void GetProperties(Type t)
{
    foreach (PropertyInfo prop in t.GetProperties())
    {
        Console.WriteLine(prop.Name);

        if (prop.PropertyType.IsClass && prop.PropertyType != typeof(String))
        {
            GetProperties(prop.PropertyType);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...