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í:
#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:
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.