繁体   English   中英

如何将数组值复制到结构

[英]How do I copy Array values to a structure

我想将数组的值复制到结构中。

例:

' The Array
Dim Columns(2) As String

' The Structure
Private Structure Fields
    Public FName As String
    Public LName As String
    Public Email As String
End Structure

' I would like to map it like so:
Fields.FName = Columns(0)
Fields.LName = Columns(1)
Fields.Email = Columns(2)

显然,如果它是如此简单,我可以编写一个函数,但是实际上有超过25列,编写一个可以映射它的函数很麻烦。

有什么办法可以做到这一点?

确实没有简单的方法可以在所有情况下正常工作。 您抱怨的是太多的努力是确保它在所有情况下都有效的唯一方法。

也就是说,如果可以保证数组中元素的数量与结构/类中的属性/字段的数量匹配,并且它们的顺序和类型相同,则可以在循环中使用Reflection,例如

Private Function Map(source As Object()) As SomeType
    Dim result As New SomeType
    Dim resultType = result.GetType()
    Dim fields = resultType.GetFields()

    For i = 0 To source.GetUpperBound(0)
        fields(i).SetValue(result, source(i))
    Next

    Return result
End Function

编辑:

我提供的代码可以像SomeType是一个类一样工作,但是,正如我第一次错过的那样,不是针对结构。 原因是结构是值类型,因此SetValue原始对象的副本发送到SetValue ,因此永远不会在该原始对象上设置字段值。 从理论上讲,为了防止创建副本,您应该能够简单地将值装箱,即将其包装在Object引用中:

Private Function Map(source As Object()) As SomeType
    Dim result As Object = New SomeType
    Dim resultType = result.GetType()
    Dim fields = resultType.GetFields()

    For i = 0 To source.GetUpperBound(0)
        fields(i).SetValue(result, source(i))
    Next

    Return DirectCast(result, SomeType)
End Function

事实证明,VB编译器对待C#编译器对待等效的C#代码的方式略有不同,并且仍然无法正常工作。 这是因为在VB中,装箱的值在传递给方法之前先取消装箱,因此仍会创建一个副本。 为了使其在VB中工作,您需要使用ValueType引用而不是Object

Private Function Map(source As Object()) As SomeType
    Dim result As ValueType = New SomeType
    Dim resultType = result.GetType()
    Dim fields = resultType.GetFields()

    For i = 0 To source.GetUpperBound(0)
        fields(i).SetValue(result, source(i))
    Next

    Return DirectCast(result, SomeType)
End Function

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM