Delegados Generales [Aporte]

Iniciado por Keyen Night, 19 Febrero 2012, 22:59 PM

0 Miembros y 1 Visitante están viendo este tema.

Keyen Night

Hace mucho tiempo que no publico nada, y la razón es que estoy superocupado :xD

Pero les traigo un aporte que seguro les servirá a muchos, cuando hice una aplicación que usaba Threads, y me di cuenta que no podía acceder a los controles, además eran demasiados controles, y propiedades para hacer un sub/function delegada para cada una de las propiedades de cada uno de los controles, lo resolví así:

Código (vb.net) [Seleccionar]
#Region " Delegados "

       Public Delegate Sub SetProperty_Delegate( _
                      ByVal ObjectControl As Control, _
                      ByVal ObjectName As String, _
                      ByVal ObjectValue As Object)

       Public Sub SetProperty( _
                             ByVal ObjectControl As Control, _
                             ByVal ObjectName As String, _
                             ByVal ObjectValue As Object)
           If ObjectControl.InvokeRequired Then
               ObjectControl.Invoke(New SetProperty_Delegate(AddressOf SetProperty), _
                                    New Object() {ObjectControl, ObjectName, ObjectValue})
           Else
               ObjectControl.GetType.GetProperty(ObjectName).SetValue( _
                                                 ObjectControl, _
                                                 ObjectValue, _
                                                 Nothing)
           End If
       End Sub

       Public Delegate Function GetProperty_Delegate( _
                         ByVal ObjectControl As Control, _
                         ByVal ObjectName As String) As Object

       Public Function GetProperty(ByVal ObjectControl As Control, _
                             ByVal ObjectName As String) As Object
           If ObjectControl.InvokeRequired Then
               Return ObjectControl.Invoke(New GetProperty_Delegate(AddressOf GetProperty), _
                                    New Object() {ObjectControl, ObjectName})
           Else
               Return ObjectControl.GetType.GetProperty(ObjectName).GetValue( _
                                                 ObjectControl, _
                                                 Nothing)
           End If
       End Function

       Public Delegate Function CallMethod_Delegate( _
                     ByVal ObjectControl As Control, _
                     ByVal ObjectName As String, _
                     ByVal ObjectParams As Object(), _
                     ByVal ObjectParamsType As Type()) As Object

       Public Function CallMethod( _
                             ByVal ObjectControl As Control, _
                             ByVal ObjectName As String, _
                             Optional ByVal ObjectParams As Object() = Nothing, _
                             Optional ByVal ObjectParamsType As Type() = Nothing) As Object

           If ObjectParams Is Nothing Then
               ObjectParams = New Object() {}
           End If

           If ObjectControl.InvokeRequired Then
               Return ObjectControl.Invoke(New CallMethod_Delegate(AddressOf CallMethod), _
                                    New Object() {ObjectControl, ObjectName, ObjectParams, ObjectParamsType})
           Else
               If ObjectParamsType Is Nothing Then
                   Return ObjectControl.GetType.GetMethod(ObjectName).Invoke( _
                                     ObjectControl, _
                                     ObjectParams)
               Else
                   Return ObjectControl.GetType.GetMethod(ObjectName, ObjectParamsType).Invoke( _
                                     ObjectControl, _
                                     ObjectParams)
               End If
           End If
       End Function

#End Region


Establece, obtiene y llama propiedades y métodos de forma segura, solo por el nombre.

Algunos ejemplos, de como se usa:

Código (vb.net) [Seleccionar]

SetProperty(Me, "Text", "Código Seguro") 'Establece la propiedad Text en Me
GetProperty(Me, "Size") 'Obtiene el Size de Me
CalMethod(Me, "Focus", New Object(){}, New Type(){}) 'Llama el sub Focus de Me


CallMethod se llama, pasando el objeto del control, seguido del nombre del método a llamar, un array de object con contiene los parámetros, y un array de Type que contiene los tipos correspondientes para la lista de parámetros, para seleccionar el método correcto en caso de una sobrecarga.
La Fé Mueve Montañas...
                                    ...De Dinero

La programación es más que un trabajo es más que un hobby es una pasión...