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.