迭代.NET中给定类型的所有属性

时间:2009-06-19 09:37:23

标签: vb.net reflection

如果我的复杂结构包含简单和复杂类型的属性,那么如何迭代此结构的所有属性以及任何非简单类型的子属性?

我有一个名为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

此代码加载我的checkboxlist,其中包含我文件类型的子属性的所有名称。我真正想要的是一个列表,其中包含构成文件的所有复杂类型的字符串类型的所有属性名称。

我对反思很新,所以我不确定如何处理这个问题。

更新

感谢您的建议到目前为止。我使用类似于提供的C#代码的Visual Basic代码创建了一个递归函数。代码现在看起来像这样:

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 个答案:

答案 0 :(得分:5)

你走在正确的轨道上,Charles,只记得:“递归”。

由于您抱怨VB.NET中类型比较的“丑陋”,请记住您还可以将类型比较为:

If TypeOf obj Is GetType(DataType) Then

正如您在C#中所做的那样。

答案 1 :(得分:2)

尝试这样的事情:

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);
        }
    }
}