【问题标题】:Converting Structure to String将结构体转换为字符串
【发布时间】:2014-01-04 15:56:36
【问题描述】:

我已经定义了这样的公共结构:

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

其中字符串“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

但这不起作用,因为结构无法转换为类型。

这里是否有可能制作这样的功能来将各种结构转换为字符串(可以放置到一些公共模块中)以及如何正确地做到这一点?

【问题讨论】:

  • 为什么?使用单独的字段或使用序列化程序正确构建数据库。不要只是用空格连接值。
  • @user1937198,由于兼容性问题,这里的序列化不好用,结构的所有字段都必须保存在单个数据库字段中,无论结构元素数量如何。
  • xmlserilizer 的问题会比这个解决方案少,因为它可以处理值中的空格。它还提供 ToString 不提供的往返保证。 XML 和 JSON 也是定义的标准,可用于任何语言。
  • 好的,我看看能不能用,谢谢。

标签: vb.net


【解决方案1】:

只需将要转换为字符串的实例作为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 的结构吗?如果没有,您应该真正使用类和属性而不是结构和字段。

【讨论】:

  • 效果很好,正如预期的那样。非常感谢!我想以后当我需要将该字符串转换回结构字段时,我可以这样做吗?
  • 问题在于,如果分隔符实际上是实例字段的一部分,这样的系统(由字符分隔的字段)将中断。为什么不直接使用适当的序列化呢?这是一个已解决的问题,只需查看 XML 或 JSON 序列化。 XML 序列化可能是在 .Net 中序列化对象的最简单方法,因为有一个内置的 XML 序列化器足以满足大多数用例。
  • 当然,我会采用不同的分隔符,但不是序列化,因为与其他可能使用相同数据的编程语言不兼容,例如纯 C。但是好的,这可能会改变,大部分问题都已经解决了解决方案。再次感谢。
猜你喜欢
  • 1970-01-01
  • 2021-06-28
  • 1970-01-01
  • 2019-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-25
相关资源
最近更新 更多