Pregunta

Estoy tratando de clonar un objeto de forma automática sin tener que crear una instancia de una nueva y copiar manualmente cada variable individual.

Recuerdo que en el día (cuando lo hice todos los días VB6) me ocurrió con un método de clonación de objetos utilizando el PropertyBag, que era bastante guay. Pero he perdido el código y no recuerdo cómo hacerlo nunca más.

¿alguien recuerda o tiene otro método?

¿Fue útil?

Solución

este lo que estabas buscando? El artículo se copia a continuación para la posteridad.

Serialize de datos utilizando un PropertyBag

Puede serializar sus datos rápidamente colocándolo en un objeto PropertyBag, entonces la lectura de la propiedad PropertyBags Contenido. Esta propiedad es realmente una matriz de bytes que es una representación de serie de los datos en el objeto PropertyBag. Se puede utilizar esta matriz de bytes para muchos propósitos, incluyendo un medio eficaz de transmisión de datos a través de DCOM:

Private Function PackData() As String
    Dim pbTemp  As PropertyBag

    'Create a new PropertyBag object
    Set pbTemp = New PropertyBag
    With pbTemp
        'Add your data to the PB giving each item a 
        'unique string key
        Call .WriteProperty("FirstName", "John")
        Call .WriteProperty("MiddleInitial", "J")
        Call .WriteProperty("LastName", "Doe")

        'Place the serialized data into a string 
        'variable.
        Let PackData = .Contents
    End With

    Set pbTemp = Nothing
End Function

Para recuperar los datos serializados, basta con crear un nuevo objeto PropertyBag y establecer la cadena serializada a su propiedad Contenidos. Convertir la cadena en una matriz de bytes antes de asignarlo a la propiedad Contenido:

Private Sub UnPackData(sData As String)
    Dim pbTemp  As PropertyBag
    Dim arData()    As Byte

    'Convert the string representation of the data to 
    'a Byte array
    Let arData() = sData

    'Create a new PropertyBag object
    Set pbTemp = New PropertyBag
    With pbTemp
        'Load the PropertyBag with data
        Let .Contents = arData()

        'Retrieve your data using the unique key
        Let m_sFirstName = .ReadProperty("FirstName")
        Let m_sMiddleInitial = _
            .ReadProperty("MiddleInitial")
        Let m_sLastName = .ReadProperty("LastName")
    End With

    Set pbTemp = Nothing
      End Sub

Mike Kurtz, McKees Rocks, Pa.

Otros consejos

método que he utilizado en el pasado está poniendo todas las variables de instancia de un UDT. Como siempre que se mantenga la UDT al día puede copiar los datos de una clase con un método único / comunicado.

Dada una clase "Persona" aquí está un ejemplo sencillo:

Private Type tPerson
    ID As Long
    FirstName As String
    LastName As String
End Type  

Private m_Person As tPerson  

Public Sub InitPerson(ID As Long, FirstName As String, LastName As String)
    m_Person.ID = ID
    m_Person.FirstName = FirstName
    m_Person.LastName = LastName
End Sub  

Friend Sub SetData(PersonData As tPerson)
    m_Person = PersonData

End Sub  

Public Function GetClone() As Person
    Dim p As New Person
    p.SetData m_Person

    Set GetClone = p

End Function  

Public Property Get FirstName() As String
    FirstName = m_Person.FirstName

End Property  

Para probar el código:

Dim p As New Person
p.InitPerson 1, "MyName", "MyLastName"

Dim p2 As Person
Set p2 = p.GetClone

MsgBox p2.FirstName

Si usted mantiene todas las instancias varianbles dentro de la UDT en lugar de declarar ellos por separado puede tener método Clone simple que necesita muy poco mantenimiento.

Otra de las ventajas es que se puede poner un UDT a un identificador de archivo para la serialización rápida en el disco.

Public Sub Save(filePathName As String)
    Dim f As Integer
    f = FreeFile()

    Open filePathName For Binary Access Write Lock Read Write As #f
        Put #f, , m_Person
    Close #f

End Sub

Una mala solución de serialización de los hombres de verdad: -)

Cada objeto en el marco de mi aplicación tiene un método de lectura y tienda. Lo que hago es pasar una corriente que escribe en un bytearray y almacenar la matriz de bytes. Si bien esto no elimina tener que manejar cada propiedad es suficiente para hacer frente a esto de una vez por la lectura y una vez para la escritura.

Una alternativa es utilizar una bolsa de propiedades como Darrel Miller dice, pero todavía tiene que lidiar con cada propiedad por separado. Si ya ha leído y almacenar entonces mi sugerencia debe ahorrar algo de tiempo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top