[英]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.