Developer's Diary

6 abril, 2014

.NET Reflection – Recorriendo propiedades de una clase II

Filed under: .net, API, ASP.Net, Awesome, Curso C#, Tips — Etiquetas: , — jnavero @ 1:59 PM

En un primer post, recorríamos las propiedades de una clase sencilla, pero ¿Qué sucede si esta clase contiene una lista de otra clase y deseamos recorrer todas las propiedades?

Pues lo que sucede, es que la cosa se complica un poco.

Aquí expongo la estructura anteriormente comentada:

Public Class Cliente
Public Property Nombre As String
Public Property Apellidos As String
Public Property Teléfonos As List(of Telefono)
End Class

Public Class Telefono
Public Property Numero As String
Public Property Tipo as String
End Class


 

Es decir, una clase cliente contiene tres propiedades, pero, una de las propiedades es una lista. Como indiqué en el primer post Reflection contiene gran cantidad de funciones y para este tipo concretamente usaremos la función: GetGenericArguments la cual puede darnos una información valiosa si nuestro tipo es una clase genérica.
Para recorrer esta clase necesitaremos funciones recursivas.
En el siguiente ejemplo muestro como hacer para recorrer una clase mas compleja


Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim client As Cliente = New Cliente
client.Apellidos = "Apellido"
client.Nombre = "Nombre"
client.Teléfonos = New List(Of Telefono) From {New Telefono With {.Numero = "Num1", .Tipo = "Movil"}, New Telefono With {.Numero = "Num2", .Tipo = "Fax"}}
RecorrerDatos(client)
End Sub

Public Shared Sub RecorrerDatos(DatosCliente As Cliente)
For Each Propiedad As PropertyInfo In DatosCliente.GetType().GetProperties
ContieneDatos(Propiedad, DatosCliente)
Next
End Sub

Private Shared Sub ContieneDatos(propiedad As PropertyInfo, tipo As Object)
Dim Dato = propiedad.GetValue(tipo, Nothing)
If Not Dato Is Nothing AndAlso Dato.GetType.GetGenericArguments.Count > 0 Then
'Se trata de una lista...
If Dato.count() = 0 Then
'Podemos hacer operaciones aquí...
Else
For Each item In Dato
For Each PropiedadItem As PropertyInfo In item.GetType().GetProperties
ContieneDatos(PropiedadItem, item)
Next
Next
End If
ElseIf Not Dato Is Nothing Then
If TypeOf (Dato) Is String Then
propiedad.SetValue(tipo, "Relleno la Propiedad", Nothing)
Else
For Each prop As PropertyInfo In Dato.GetType.GetProperties
Dim subDato = prop.GetValue(Dato, Nothing)
If TypeOf (subDato) Is String AndAlso subDato = "" Then
prop.SetValue(Dato, "Relleno la Propiedad", Nothing)
End If
Next
End If
End If
End Sub

De este código podemos destacar lo siguiente:
1º. Instanciamos nuestra clase ejemplo con una lista de teléfonos
2º. recorremos las propiedades con un for each y llamamos a nuestra función recursiva (Es posible hacerlo todo únicamente con la función recursiva, pero así creo que está mas claro).
Ahora con reflection puedo hacer lo siguiente:
Con Dim Dato = propiedad.GetValue(tipo, Nothing) recupero el valor de la propiedad, esto me permite hacer Dato.GetType.GetGenericArguments.Count > 0 y así determino si existen propiedades genéricas para poder saber si se trata de una lista genérica (por ejemplo).
Si se trata de una lista, pasamos a recorrer las diferentes propiedades de la lista con otro for each que llama a la propia función y así sucesivamente.
Por ultimo he querido añadir la siguiente línea:
prop.SetValue(Dato, “Relleno la Propiedad”, Nothing)
Con esta línea, podemos cambiar el valor de la propiedad.

Aquí lo dejo por el momento, así que hasta el próximo post!

Anuncios

Dejar un comentario »

Aún no hay comentarios.

RSS feed for comments on this post. TrackBack URI

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: