Monday, November 7, 2011

System.reflection


Qué es Reflection? Para qué sirve? En qué me es útil? Cuándo usar? Bueno, si te has hecho estas preguntas vas bien, yo también me las hice, jejeje.

Empezemos por la definición:

Reflection proporciona objetos (de tipo Type) que encapsulan ensamblados, módulos y tipos. Se puede utilizar la reflexión para crear dinámicamente una instancia de un tipo, enlazar el tipo a un objeto existente u obtener el tipo a partir de un objeto existente, e invocar sus métodos o tener acceso a sus campos y propiedades.

Reflection es una “tecnica” para poder extraer la metadata de nuestras estructuras de datos dentro de una assembly.

Reflection es la habilidad que tiene un código para revisar su propia estructura, es decir, podemos revisar la metadata que está en el assembly y manipularla a nuestro antojo.

Utilidades

Nos ayuda a consultar qué propiedades o métodos tiene un objeto en TIEMPO DE EJECUCIÓN.

Podemos diseñar un formulario dinámicamente.

Empezando a utilizar Reflection. HowTo

Hay dos formas: usando typeof() o GetType(). Ambas formas retornan un objeto tipo Type, ese es el que nos otorga a información que queremos.

Entre los principales métodos de Type están:

GetField() Obtiene el campo según el nombre.

GetMethod() Obtiene un método, y si éste tiene sobre cargas, al igual que el constructor, hay que pasarle el tipo correspondiente de la sobre carga.

GetProperty() Obtiene la propiedad según el nombre.

Nota: aparte de los métodos anteriores existen los mismos en plural, es decir que en vez de obtener un miembro, obtienes un arreglo con los resultados según los parámetros que le indiques. Ejm: GetProperty() tienes: GetProperties() el cual puedes llamar sin parámetros para obtener un PropertyInfo[] con todas las propiedades.

Let's do it. Ejemplo.

A continuación un ejemplo para fines académicos, dada una clase persona, usando reflection asignaré valores a sus propiedades. Primero lleno un diccionario cuya Key es el nombre de la propiedad de la clase y su Value obviamente el nombre que le quiero asignar a esa propiedad. Luego, recorro el diccionario para extraer sus propiedades y asignarles  un valor.

Imports System.Reflection
Imports System.Collections.Generic

Module Module1
    Sub Main()
        Dim atributosPersona As New Dictionary(Of String, String)
        atributosPersona.Add("pNombre", "Lizzy")
        atributosPersona.Add("pApellido", "Mendivil")

        Dim p As New clsPersona
        For Each atributo In atributosPersona
            Dim pf As PropertyInfo = p.GetType.GetProperty(atributo.Key)
            pf.SetValue(p, atributo.Value, Nothing)
        Next

        Console.WriteLine("Nombre: {0}", p.pNombre)
        Console.WriteLine("Apelllido: {0}", p.pApellido)
    End Sub

    Public Class clsPersona
        Private strNombre As String
        Private strApellido As String

        Public Property pNombre() As String
            Get
                Return strNombre
            End Get
            Set(ByVal value As String)
                strNombre = value
            End Set
        End Property

        Public Property pApellido() As String
            Get
                Return strApellido
            End Get
            Set(ByVal value As String)
                strApellido = value
            End Set
        End Property
    End Class
End Module

HaPPy Coding =)

No comments:

Post a Comment