检查属性是否为数组

时间:2014-04-04 01:00:15

标签: arrays vb.net properties indexing

我想检查一个类中的属性是否是一个数组(这里只关注数值数组,不是字符数组[即字符串])。然后我想迭代数组(即'对每个元素做一些事情')。请参阅下面的尝试。谢谢!

编辑:
所以,多一点信息......到目前为止,IsArray和我的方法都没有用于检查数组。 MSDN建议“typeof(Array).IsAssignableFrom(type)”,但我不知道如何在这里使用属性信息。但也许其他人知道如何使用它们,我只是没有正确使用。

在“Class3”中我定义了一个数组,但没有标注它。当我在另一个线程中实例化它并在将它传递给此函数之前加载它时,我使用“redim”。当我在这里的代码中插入断点时,我可以查看“myobject”并查看数组元素和值,但实际上我正在寻找干净地使用propertyinfo类型来概括此方法。一旦我确定它是一个数组,我还需要能够索引数组...再次使用propertyinfo,而不是直接使用“myobject”。

Public Class Class2
Private Shared filelock As New Object
Public Shared Sub write2file(ByVal myobject As Class3)
    SyncLock filelock
        Dim sb As New StringBuilder
        Using sw As StreamWriter = New StreamWriter(File.Open(newfilename, FileMode.Append, FileAccess.Write, FileShare.None))
            'Dim pinfo() As PropertyInfo = GetType(Class3).GetProperties
            Dim pinfo() As PropertyInfo = CType(myobject.GetType.GetRuntimeProperties, PropertyInfo())
            sb.Clear()
            For Each p As PropertyInfo In pinfo
                If Not p.GetIndexParameters.Length > 0 Then 'if property is not an array
                    sb.Append(p.GetValue(myobject)).Append(",")

                Else ' if property is an array
                    For x As Integer = 0 To p.GetIndexParameters.Length - 1
                        sb.Append(p.GetValue(myobject, New Object() {x})).Append(",") 'append each value from array to the stringbuilder in .CSV format
                    Next
                End If
            Next
            sw.WriteLine(sb) 'write string to file
        End Using

    End SyncLock

End Sub

结束班

2 个答案:

答案 0 :(得分:-1)

嗯,这不是最漂亮的事情(我在某种程度上感觉不舒服,比较类型与字符串...如果有人知道更好请告诉我),但我测试了它,它的工作原理:

For Each p As PropertyInfo In pinfo
    Dim typeString As String = p.PropertyType.Name.ToString
    If typeString = "Int32[]" Then 'if property is not an array
        sb.Append(p.GetValue(myobject)).Append(",")
    Else ' if property is an array
        For x As Integer = 0 To p.GetIndexParameters.Length - 1
            sb.Append(p.GetValue(myobject, New Object() {x})).Append(",") 'append each value from array to the stringbuilder in .CSV format
        Next
    End If
Next

这是你在找什么?


  

这里只关注数值数组,不是字符数组[即字符串]

如果用“数字”表示它可以是任何类型(不仅仅是整数),并且你100%确定数组是数字还是字符串(我的意思是,例如,没有布尔数组),那么你可以修改它:

If typeString.EndsWith("[]") And typeString <> "String[]" Then

我希望它有所帮助...

答案 1 :(得分:-1)

用这样的东西替换If块,它似乎与一个具有Int32()数组属性的普通Class3实现一起工作:

If p.PropertyType.IsArray Then
  ' Untested loop code for array case
Else
  ' Untested code for scalar (non-array) case
End If

似乎没有人推荐过PropertyType属性,但这非常重要。