Plateforme Level Extreme
Abonnement
Profil corporatif
Produits & Services
Support
Légal
English
Another conversion from C# to VB.NET
Message
De
17/04/2013 10:35:52
 
 
À
17/04/2013 10:29:32
Information générale
Forum:
ASP.NET
Catégorie:
Code, syntaxe and commandes
Versions des environnements
Environment:
VB 9.0
OS:
Windows 7
Network:
Windows 2003 Server
Database:
MS SQL Server
Application:
Web
Divers
Thread ID:
01571174
Message ID:
01571221
Vues:
27
>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
Précédent
Répondre
Fil
Voir

Click here to load this message in the networking platform