Alejandro B. Martin - Blog de Asp.Net y MsSQL

Abril 25, 2008

Propiedades dinámicas

Con el presente explico -para aquellos a los que les pueda ser útil-, cómo consultar y asignar valores de forma dinámica a las propiedades de cualquier objeto o control de servidor. Requiere el Framework .Net 2.0+ (o superior)

A mi me costó bastante encotrar información, y me ha resultado de mucha utilidad para el gran proyecto -fase 1/3 para 2/3- que llevo desarrollando desde el 2007 [Fase1: GoldByWebs]

Primero mostraré el contexto con algún ejemplo y luego descubro el código mínimo-necesario para tal fin (para no enrollarse y para que descubras lo básico; así luego cada cual con lo suyo ..).

Supongamos que tenemos un GridView -o cualquier otro control e incluso un objeto(object)-, para el que los valores que queremos asignar a sus propiedades no los sabemos en tiempo de diseño; bien los recojemos de una base de datos, o bien de un array, o de donde sea pero sin saber de antemano; ni los valores que vamos a darlas, ni las mismas propiedades a las que asignar dichos valores, ..
-

EJEMPLO PRACTICO:
Tenemos un aplicativo en el que queremos que cada usuario pueda personalizar determinadas propiedades de un control GridView; al que llamaremos UserGridView.

Dynamic properties - Propiedades dinámicas con .Net

Los usuarios acceden a un formulario donde se les pide que definan que valores quieren personalizar para determinadas propiedades de un GridView:

El usuario Pepito a definido que quiere personalizar dicho gridview con los siguientes valores:
Caption = “Pepito quiere así su gridview”, Width = “400px” y Backcolor = “Yelow”

Fulanita por ello define:
Caption = “GridView de Fulanita”, Width = “550px” , Backcolor = “Pink” y BorderStyle=”Dashed”.

Dichos datos son guardados -están almacenados pues- en la base de datos.


COMO PODEMOS HACER PARA QUE A LOS USUARIOS SE LES MUESTRE EL GRID COMO ELLOS QUERIAN. COMO PODEMOS ASIGNAR PROPIEDADES DE FORMA DINAMICA EN .NET

::TENIENDO Y TOMANDO COMO BASE::

-Que determinada consulta a la base de datos para determinado usuario a devuelto un List(of ListItem) con el par “NombreDePropiedad/ValorQueDefinióElUsuario” (.text/.value) [aunque también podría tratarse de un datatable, etc ..]

Lo que muchos hacen, -sólo si saben las propiedades que pueden definir los usuarios, o bien si implementan condicionales tipo If Not IsNothing- es programar algo así como:
-EJEMPLO NO DINÁMICO-

‘[Consulta a la DBA para rellenar este List con el Par NombrePropiedad/Valor (.text/.value)]
Dim ObjPropertiesListOfListItem As New List(Of ListItem)


‘ Según el gráfico, en este caso No Dinámico, sabemos que 0=Caption

UserGridView.Caption = ObjPropertiesListOfListItem(0).Value

UserGridView.Width = ObjPropertiesListOfListItem(1).Value

‘ ..

-
-EJEMPLO DINAMICO- IMPLEMENTANDO PROPIEDADES DINAMICAS EN .NET - REFLECTION

        '.. [Consulta a la DBA para rellenar este List con el Par NombrePropiedad/Valor (.text/.value)]
        Dim ObjPropertiesListOfListItem As New List(Of ListItem)
yyy
        'Creamos un ArrayList que se rellena con las propiedades que descubre la Function arrPropiedadesDeObjeto para el GridView
        Dim arrDePropiedadesDeMiUserGridView As ArrayList = arrPropiedadesDeObjeto(UserGridView)
        'Para tantas propiedades customizadas cómo se recojiesen de la dba (almacenadas en: ObjPropertiesListOfListItem)
        For x = 0 To ObjPropertiesListOfListItem.Count - 1
            'Comprobamos si el objeto (UserGridView) admite -tiene- x determinada propiedad; buscando si esta en el array
            If arrDePropiedadesDeMiUserGridView.Contains(ObjPropertiesListOfListItem(x).Text) Then
                'Si fuere el caso, llamamos a SetProperty para customizar el objeto con el valor de propiedad
                SetProperty(UserGridView, ObjPropertiesListOfListItem(x).Text, ObjPropertiesListOfListItem(x).Value)
            End If
        Next

Ahora el Function y el Sub, tan esperados !!

    ''' <summary>Devuelve un array que contiene las propiedades de determinado objeto.</summary>
    ''' <param name="objeto">Cualquier objeto; aunque normalmente suelen ser Controles de Servidor</param>
    Public Function arrPropiedadesDeObjeto(ByVal objeto As Object) As ArrayList
        Dim PropertyInfo As System.Reflection.PropertyInfo() = objeto.GetType.GetProperties() 'Me.GetType.GetProperties()
        Dim PropertyItem As System.Reflection.PropertyInfo
        Dim _arrAvolver As New ArrayList
        For Each PropertyItem In PropertyInfo : _arrAvolver.Add(PropertyItem.Name) : Next
        Return _arrAvolver
    End Function
    ''' <summary>Adjudica un valor a una propiedad de un determinado objeto</summary>
    ''' <param name="Objeto">El objeto al que -por reflection- pasar el PropertyValue</param>
    ''' <param name="PropertyName">El nombre de la propiedad</param>
    ''' <param name="PropertyValue">El valor que se la quiere adjudicar</param>
    Public Sub SetProperty(ByVal Objeto As Object, ByVal PropertyName As String, ByVal PropertyValue As String)
        Dim userType As Type = Me.GetType()
        Dim UserProp As System.Reflection.PropertyInfo = userType.GetProperty(PropertyName)
        UserProp.SetValue(Objeto, PropertyValue, Nothing)
    End Sub

Las ventajas que ofrece el uso del dinamismo, són enormes en lo que refiere a escalabilidad, aunque hay que anotar que el uso de “Reflection” siempre conlleva una demora de tiempo, es decir, que las páginas o forms tardarán algo más en cargarse, pero no mucho ..

Copyright 25 Abril 2008 © Alejandro Barrada Martin - Reservados todos los derechos salvo consentimiento del autor.
El autor cede los derechos de publicación del presente artículo siempre y cuando se mencione al mismo y a esta url-dirección web.

Blog de WordPress.com.