Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
Another conversion from C# to VB.NET
Message
From
17/04/2013 10:35:52
 
 
General information
Forum:
ASP.NET
Category:
Coding, syntax and commands
Environment versions
Environment:
VB 9.0
OS:
Windows 7
Network:
Windows 2003 Server
Database:
MS SQL Server
Application:
Web
Miscellaneous
Thread ID:
01571174
Message ID:
01571221
Views:
29
>So what type in cloneObject ?

Here is the full code I succeeded to convert into .NET for making a deep copy of an object. That is the only line I wasn't able to complete:
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 Class
The method to look into is InternalCopy(). This is where I have this line.
Michel Fournier
Level Extreme Inc.
Designer, architect, owner of the Level Extreme Platform
Subscribe to the site at https://www.levelextreme.com/Home/DataEntry?Activator=55&NoStore=303
Subscription benefits https://www.levelextreme.com/Home/ViewPage?Activator=7&ID=52
Previous
Reply
Map
View

Click here to load this message in the networking platform