Foros del Web » Programación para mayores de 30 ;) » .NET »

Asignar una instancia de una clase a otra desde dentro de la ultima clase

Estas en el tema de Asignar una instancia de una clase a otra desde dentro de la ultima clase en el foro de .NET en Foros del Web. Hola a todos, Acabo de retomar un viejo proyecto, dentro del mismo me gustaría crear una clase para manejar la configuración de la aplicación (ya ...
  #1 (permalink)  
Antiguo 25/10/2010, 11:04
 
Fecha de Ingreso: junio-2009
Mensajes: 10
Antigüedad: 14 años, 9 meses
Puntos: 0
Asignar una instancia de una clase a otra desde dentro de la ultima clase

Hola a todos,

Acabo de retomar un viejo proyecto, dentro del mismo me gustaría crear una clase para manejar la configuración de la aplicación (ya sé que existe el "My.Settings") de forma que se pueda guardar y recuperar.

Esto es bastante sencillo gracias a la simplicidad de la "serialización/deserialización". El problema que me encuentro es que al deserializar el objeto en un método público de la misma clase, no lo puedo asignar directamente a la misma instancia del objeto. Sí que puedo crear otra instancia y asignar el objeto deserializado a la otra instancia, pero no a la misma.

El código que empleo es el siguiente:

Public Function Cargar() As Boolean
If File.Exists(_archivo) Then
Try
fs = File.OpenRead(_archivo)
seriador = New BinaryFormatter
Me = CType(seriador.Deserialize(fs), cConfiguracion)
Cargar = True
Catch ex As IOException
Throw New Exception("No se puede cargar la configuración" & vbNewLine & ex.Message)
Finally
fs.Close()
End Try
Else
Throw New Exception("No existe el archivo de configuración")
Return False
End If
End Function

Me dice que no se puede asignar nada a "Me", he probado una alternativa que no genera error, pero tampoco obtengo resultados, esta es crear un método "private" de la siguiente forma:

Private Sub Asignar(ByRef Config As cConfiguracion, ByVal Cargado As cConfiguracion)
Config = Cargado
End Sub

Llamado mediante la siguiente línea: "Asignar(Me, ConfigCargada)". Donde ConfigCargada es la instancia que se crea al deserializar.

¿conoceis alguna forma de hacer esto?

Gracias.

Un saludo
  #2 (permalink)  
Antiguo 27/10/2010, 12:06
 
Fecha de Ingreso: junio-2009
Mensajes: 10
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: Asignar una instancia de una clase a otra desde dentro de la ultima clase

Me comentan que no está muy claro, así que lo expongo de otra forma. Tengo una clase llamada configuración, con unas propiedades públicas y 2 métodos "Guardar" y "Cargar" con el siguiente esquema:

Código vb:
Ver original
  1. Public class Configuracion
  2.  
  3. Public Usuario as String
  4. Public RutaBD as String
  5.  
  6. Public Function Guardar() as Boolean
  7. 'Aquí serializo la clase, funciona Ok.
  8. End Function
  9.  
  10. Public Function Cargar() as Boolean
  11. 'Esta es la rutina que me genera el problema, la intención es cargar la info del archivo
  12. 'en la misma instancia de la clase, con el siguiente código
  13. Me = CType(seriador.Deserialize(fs), cConfiguracion)
  14. 'Genera error porque no se puede asignar nada a "Me"
  15. End Function
  16.  
  17. End class

Pretendo que al iniciar la aplicación se genere una instancia de la clase "cConfiguración" llamada "Configuracion", cargar en ella los parámetros de configuración mediante el método "Cargar()" y cuando finalice la aplicación llamar al método "Guardar()" para guardar los posibles cambios en la configuración.

Código vb:
Ver original
  1. Public Configuracion as cConfiguracion
  2.  
  3. Public Sub IniciarAplicacion()
  4. ' Creo una instancia de la clase
  5. Configuracion=new cConfiguracion
  6. ' Cargo la información en la instancia
  7. Configuracion.Cargar()
  8. End Sub
  9.  
  10. Public Sub MostrarUsuario()
  11. MsgBox ("Usuario: " & Configuracion.Usuario)
  12. End Sub
  13.  
  14. Public Sub CambiarUsuario(ByVal Usuario as String)
  15. Configuracion.Usuario=Usuario
  16. End Sub
  17.  
  18. Public Sub FinalizarAplicacion()
  19. Configuracion.Guardar()
  20. End Sub

Como os comento todo funciona Ok, excepto que no soy capaz de cargar la información en la misma instancia de la clase. Funciona si lo cargo en otra instancia, pero no en la misma.

Código vb:
Ver original
  1. ' Sí que funciona:
  2. Public Function Cargar() as Boolean
  3. dim Configuracion2 as new cConfiguracion
  4. Configuracion2 = CType(seriador.Deserialize(fs), cConfiguracion)
  5. ' El inconveniente es que así no me sirve, tendría que construir
  6. 'el método de cargar la configuración externo a la definición de la clase.
  7. End Function
  8.  
  9. 'No funciona (y es lo que quiero conseguir)
  10. Me = CType(seriador.Deserialize(fs), cConfiguracion)

¿Alguien me puede ayudar?

Un saludo a todos
  #3 (permalink)  
Antiguo 28/10/2010, 01:36
Avatar de kennyhp  
Fecha de Ingreso: julio-2006
Mensajes: 370
Antigüedad: 17 años, 9 meses
Puntos: 5
Respuesta: Asignar una instancia de una clase a otra desde dentro de la ultima clase

¿donde instancias fs?
  #4 (permalink)  
Antiguo 28/10/2010, 03:08
 
Fecha de Ingreso: junio-2009
Mensajes: 10
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: Asignar una instancia de una clase a otra desde dentro de la ultima clase

Puedes verlo en el primer post, como variable local dentro de la clase, lo abro dentro de cada método "Guardar()" y "Cargar()", te lo copio aquí:

Código vb:
Ver original
  1. Public Function Cargar() As Boolean
  2.  
  3. fs = File.OpenRead(_archivo)
  4. seriador = New BinaryFormatter
  5. Me = CType(seriador.Deserialize(fs), cConfiguracion)
  6. fs.Close()
  7.  
  8. End Function

No obstante eso funciona correctamente si lo asigno otra instancia de la clase "cConfiguracion".

Un saludo y gracias por el interés.
  #5 (permalink)  
Antiguo 28/10/2010, 03:22
 
Fecha de Ingreso: junio-2009
Mensajes: 10
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: Asignar una instancia de una clase a otra desde dentro de la ultima clase

am...no lo he puesto, es un filestream.

Private fs as FileStream
  #6 (permalink)  
Antiguo 30/10/2010, 18:35
 
Fecha de Ingreso: junio-2009
Mensajes: 10
Antigüedad: 14 años, 9 meses
Puntos: 0
Información Respuesta: Asignar una instancia de una clase a otra desde dentro de la ultima clase

Ya lo he conseguido resolver, a través de "System.Reflection", tras bucear mucho por la web he encontrado este "Namespace" por el cual se puede tener acceso a las propiedades, campos, eventos, métodos, etc... de un objeto/clase.

El código queda de la siguiente forma:

Código vb:
Ver original
  1. 'Recordad que antes de la declaración de la clase hay que añadir la
  2. 'referencia a System.Reflection:
  3. 'Imports System.Reflection
  4.  
  5. Public Function Cargar() As Boolean
  6.         ' Declaro una instancia de la misma clase
  7.        Dim Objeto As cConfiguracion
  8.         ' Recupero la configuración guardada en el archivo
  9.        'y lo almaceno en "Objeto"
  10.        If File.Exists(_archivo) Then
  11.             Try
  12.                 fs = File.OpenRead(_archivo)
  13.                 seriador = New BinaryFormatter
  14.                 Objeto = CType(seriador.Deserialize(fs), cConfiguracion)
  15.                 Cargar = True
  16.             Catch ex As Exception
  17.                 Throw New Exception("No se puede cargar la configuración" & vbNewLine & ex.Message)
  18.             Finally
  19.                 fs.Close()
  20.             End Try
  21.         Else
  22.             Throw New Exception("No existe el archivo de configuración")
  23.             Return False
  24.         End If
  25.         ' Ahora asigno los valores a la clase original
  26.        ' Mediante el Namespace Reflection recupero las variables
  27.        ' También se pueden recuperar las propiedades, etc... pero en este caso no es necesario
  28.        Dim tipo As Type = GetType(cConfiguracion)
  29.         Dim limites As BindingFlags = BindingFlags.Instance _
  30.                         Or BindingFlags.Public _
  31.                         Or BindingFlags.DeclaredOnly _
  32.                         Or BindingFlags.Static _
  33.                         Or BindingFlags.NonPublic
  34.         Dim campos As FieldInfo() = tipo.GetFields(limites)
  35.         For Each campo As FieldInfo In campos
  36.             'Solo quiero asignar las variables "Serializables"
  37.            If Not campo.IsNotSerialized Then
  38.                 'FieldInfo.SetValue(instancia,valor)
  39.                'FieldInfo.GetValue(instancia)
  40.                campo.SetValue(Me, campo.GetValue(Objeto))
  41.             End If
  42.         Next
  43.     End Function

Ya tengo una clase de configuración a la que solo tengo que añadir nuevas variables en la declaración de la clase según precise, y no necesito añadir más código para guardar esa información.

Espero que os sirva.

Etiquetas: asignar, clase, instancia, ultimo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:39.