我已经定义了这样的公共结构:
Public Structure myList
Dim a As String
Dim b As Integer
Dim c As Double
End Structure
稍后在代码中我将值赋给它的实例:
Dim myInstance As New myList
myInstance.a = "Nemo"
myInstance.b = 10
myInstance.c = 3.14
然后我可以将这些值转换为字符串(用于存储到数据库),如下所示:
Dim newString As String = ""
Dim i As Integer
Dim myType As Type = GetType(myList)
Dim myField As System.Reflection.FieldInfo() = myType.GetFields()
For i = 0 To myField.Length - 1
newString &= myField(i).GetValue(myInstance) & " "
Next i
string" newString"包含每个字段的值。 所有这些都可以。
现在我想为程序中的几种不同结构进行转换,但我不能(不知道如何)将某些结构和实例传递给函数。
我的尝试:
Public Function StructToString(ByVal myStruct As System.Type) As String
Dim structString As String = ""
Dim i As Integer
Dim myType As Type = GetType(myStruct)
Dim myField As FieldInfo() = myType.GetFields()
For i = 0 To myField.Length - 1
newString &= myField(i).GetValue(Nothing) & " "
Next i
Return structString
End Function
但由于结构无法转换为类型,因此无法正常工作。
是否有可能将各种结构转换为字符串(可以放置到某些公共模块)以及如何正确地执行此操作?
答案 0 :(得分:4)
只需将要转换的实例传递给Object
字符串,然后使用GetType()
实例方法获取实例的Type
。
Public Function StructToString(obj As Object) As String
Dim structString As String = ""
Dim i As Integer
Dim myType As Type = obj.GetType()
Dim myField As FieldInfo() = myType.GetFields()
For i = 0 To myField.Length - 1
structString += myField(i).GetValue(obj) & " "
Next i
Return structString
End Function
请注意,您的字符串将以空格结尾,因此您可能应该使用String.Join
进行字符串连接。这是你的函数写成一行:
Public Function StructToString(obj As Object) As String
Return String.Join(" ", obj.GetType().GetFields().Select(Function(field) field.GetValue(obj)))
End Function
请注意,如果任何字符串字段包含空格,那么在这样的数据库中存储东西的系统将会中断。为什么不创建一个正确的数据库模式或使用序列化?或者至少使用另一个分隔符而不是空格。
此外,您是否有任何特定理由使用public mutable fields结构?如果没有,你应该使用类和属性而不是结构和字段。