Imports System.Collections.Generic Imports System.Reflection Public NotInheritable Class ObjectExtensions Private Sub New() End Sub Private Shared ReadOnly CloneMethod As MethodInfo = GetType([Object]).GetMethod("MemberwiseClone", _ BindingFlags.NonPublic Or BindingFlags.Instance) Public Shared Function IsPrimitive(type As Type) As Boolean If type Is GetType([String]) Then Return True End If Return (type.IsValueType And type.IsPrimitive) End Function Public Shared Function Copy(originalObject As [Object]) As [Object] Return InternalCopy(originalObject, New Dictionary(Of [Object], [Object])(New ReferenceEqualityComparer())) End Function Private Shared Function InternalCopy(originalObject As [Object], visited As IDictionary(Of [Object], [Object])) As [Object] If originalObject Is Nothing Then Return Nothing End If Dim typeToReflect = originalObject.[GetType]() If IsPrimitive(typeToReflect) Then Return originalObject End If If visited.ContainsKey(originalObject) Then Return visited(originalObject) End If Dim cloneObject = CloneMethod.Invoke(originalObject, Nothing) If typeToReflect.IsArray Then Dim arrayType = typeToReflect.GetElementType() If IsPrimitive(arrayType) = False Then Dim clonedArray As Array = DirectCast(cloneObject, Array) clonedArray.ForEach(Function(array, indices) array.SetValue(InternalCopy(clonedArray.GetValue(indices), visited), indices)) End If End If visited.Add(originalObject, cloneObject) CopyFields(originalObject, visited, cloneObject, typeToReflect) RecursiveCopyBaseTypePrivateFields(originalObject, visited, cloneObject, typeToReflect) Return cloneObject End Function Private Shared Sub RecursiveCopyBaseTypePrivateFields(originalObject As Object, _ visited As IDictionary(Of Object, Object), cloneObject As Object, typeToReflect As Type) If typeToReflect.BaseType IsNot Nothing Then RecursiveCopyBaseTypePrivateFields(originalObject, visited, cloneObject, typeToReflect.BaseType) CopyFields(originalObject, visited, cloneObject, typeToReflect.BaseType, _ BindingFlags.Instance Or BindingFlags.NonPublic, Function(info) info.IsPrivate) End If End Sub Private Shared Sub CopyFields(originalObject As Object, visited As IDictionary(Of Object, Object), cloneObject As Object, typeToReflect As Type, _ Optional bindingFlags__1 As BindingFlags = BindingFlags.Instance Or BindingFlags.NonPublic Or _ BindingFlags.[Public] Or BindingFlags.FlattenHierarchy, Optional filter As Func(Of FieldInfo, Boolean) = Nothing) For Each fieldInfo As FieldInfo In typeToReflect.GetFields(bindingFlags__1) If filter IsNot Nothing AndAlso filter(fieldInfo) = False Then Continue For End If If IsPrimitive(fieldInfo.FieldType) Then Continue For End If Dim originalFieldValue = fieldInfo.GetValue(originalObject) Dim clonedFieldValue = If(originalFieldValue Is Nothing, Nothing, InternalCopy(originalFieldValue, visited)) fieldInfo.SetValue(cloneObject, clonedFieldValue) Next End Sub Public Shared Function Copy(Of T)(original As T) As T Return DirectCast(Copy(DirectCast(original, [Object])), T) End Function End Class Public Class ReferenceEqualityComparer Inherits EqualityComparer(Of [Object]) Public Overrides Function Equals(x As Object, y As Object) As Boolean Return ReferenceEquals(x, y) End Function Public Overrides Function GetHashCode(obj As Object) As Integer If obj Is Nothing Then Return 0 End If Return obj.GetHashCode() End Function End Class Public NotInheritable Class ArrayExtensions Private Sub New() End Sub Public Shared Sub ForEach(array As Array, action As Action(Of Array, Integer())) Dim walker As New ArrayTraverse(array) Do action(array, walker.Position) Loop While walker.[Step]() End Sub End Class Friend Class ArrayTraverse Public Position As Integer() Private maxLengths As Integer() Public Sub New(array As Array) maxLengths = New Integer(array.Rank - 1) {} For i As Integer = 0 To array.Rank - 1 maxLengths(i) = array.GetLength(i) - 1 Next Position = New Integer(array.Rank - 1) {} End Sub Public Function [Step]() As Boolean For i As Integer = 0 To Position.Length - 1 If Position(i) < maxLengths(i) Then Position(i) += 1 For j As Integer = 0 To i - 1 Position(j) = 0 Next Return True End If Next Return False End Function End ClassThe method to look into is InternalCopy(). This is where I have this line.