Test Foro de elhacker.net SMF 2.1

Programación => Programación General => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Keyen Night en 19 Febrero 2012, 22:59 PM

Título: Delegados Generales [Aporte]
Publicado por: Keyen Night en 19 Febrero 2012, 22:59 PM
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.