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