Reflexionando con Reflection...

Hoy un compañero me ha hecho la siguiente consulta:

"Un compañero mio tiene una clase creada con muchas propiedades (unas 40 o asi). En el codigo de asp.net tiene un datatable con una fila y varias columnas, y el nombre de esas columnas coincide con cada una de las propiedades. Tiene que introducir en cada propiedad su correspondiente valor del datatable, por ejemplo asi
with claseprueba
         .propiedad1 = oDT.rows(0).item(0).item("propiedad1")
         .propiedad2 = oDT.rows(0).item(0).item("propiedad2")
         .....

El caso es que claro, al ser 40 pues meter todo eso a pelo es trabajo pesado aparte de quedar muy feo en el codigo, y dando gracias porque en vez de 40 no son 400. Yo creo que debe haber alguna forma de recorrer todas las propiedades de la clase para poder simplificar esto. En principio pensé en hacer un for each pero como no lo he tocado nunca pues no consigo nada."

Pues manos a la obra le he preparado una solución de Consola de ejemplo para que viese como hacerlo:

Dada una clase Prueba con 3 propiedades, recorremos dichas propiedades, obtenemos el nombre y las establecemos un valor que en este caso es el nombre de la propiedad en concreto:

   1:  Imports System.Reflection
   2:   
   3:  Module Module1
   4:   
   5:      Sub Main()
   6:          Dim prueba As Prueba = New Prueba
   7:          Dim mitype As Type = Type.GetType("Reflection.Prueba")
   8:          Dim members As MemberInfo() = mitype.GetMembers()
   9:          For Each member As MemberInfo In members
  10:              If member.MemberType = MemberTypes.Property Then
  11:                  Dim p As PropertyInfo = CType(member, PropertyInfo)
  12:                  p.SetValue(prueba, member.Name, Nothing)
  13:              End If
  14:          Next
  15:          Console.WriteLine("Valor Propiedad A: {0}", prueba.PropiedadA)
  16:          Console.WriteLine("Valor Propiedad B: {0}", prueba.PropiedadB)
  17:          Console.WriteLine("Valor Propiedad V: {0}", prueba.PropiedadC)
  18:          Console.Read()
  19:      End Sub
  20:   
  21:  End Module
  22:   
  23:  Class Prueba
  24:      Dim a As String
  25:      Dim b As String
  26:      Dim c As String
  27:   
  28:      Public Property PropiedadA() As String
  29:          Get
  30:              Return a
  31:          End Get
  32:          Set(ByVal Value As String)
  33:              a = Value
  34:          End Set
  35:      End Property
  36:   
  37:      Public Property PropiedadB() As String
  38:          Get
  39:              Return b
  40:          End Get
  41:          Set(ByVal Value As String)
  42:              b = Value
  43:          End Set
  44:      End Property
  45:   
  46:      Public Property PropiedadC() As String
  47:          Get
  48:              Return c
  49:          End Get
  50:          Set(ByVal Value As String)
  51:              c = Value
  52:          End Set
  53:      End Property
  54:  End Class

Fijandonos en el bucle, obtenemos las propiedades de la clase Prueba y mediante el objeto PropertyInfo establecemos el valor a la propiedad correspondiente, así para el caso del grid haríamos:

   1:  For Each member As MemberInfo In members
   2:      If member.MemberType = MemberTypes.Property Then
   3:          Dim p As PropertyInfo = CType(member, PropertyInfo)
   4:          p.SetValue(claseprueba, oDT.rows(0).item(0).item(member.Name), Nothing)
   5:      End If
   6:  Next

Prometo escribir algo más sobre Reflection ya que para la certificación tuve que empollar un poco. como veo que en el preview se corta os pongo un zip con el código.

Y con esto y un bizcocho hasta mañana a las 8:30 que entro a currar.

Attachment: Reflection.zip
Published 10/1/2007 15:11 por Luis Ruiz Pavón
Archivado en: ,
Comparte este post:
http://geeks.ms/blogs/lruiz/archive/2007/01/10/reflexionando-con-reflection.aspx

Comentarios

# re: Reflexionando con Reflection...

pues si, ya cuando se mete uno en estas ondas, empiezan a salir otros detallitos, que resulta que se estan guardando los tipos bool como ints (0,1), que algunas propiedades son readonly, que usas nullable types, etc... y va creciendo el codigo... y luego la pregunta si mejor deberia usar uno un ORM, que realmente es lo que hacen

Wednesday, January 10, 2007 5:18 PM por Eber Irigoyen

# re: Reflexionando con Reflection...

Pero para ciertas cosas viene de maravilla, como por ejemplo esta, que en un bucle de 4 líneas te quitas 40 o n líneas de código.

Salu2

Wednesday, January 10, 2007 6:12 PM por Luis Ruiz Pavón

# re: Reflexionando con Reflection...

Y si se quisieran obtener los valores de una enumeración, cómo podría hacerse ???

Saludos

Thursday, January 11, 2007 11:43 PM por espinete

# re: Reflexionando con Reflection...

Friday, January 12, 2007 9:58 AM por Luis Ruiz Pavón