我想检查一个类中的属性是否是一个数组(这里只关注数值数组,不是字符数组[即字符串])。然后我想迭代数组(即'对每个元素做一些事情')。请参阅下面的尝试。谢谢!
编辑:
所以,多一点信息......到目前为止,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
结束班
答案 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属性,但这非常重要。