Propiedades y Metodos
-
jueves, 16 de febrero de 2012 20:59
Buenas tardes
Tengo un problema, elabore una clase basada en un textbox en VB, la cual hereda todas sus propiedades y metodos, mas unas propiedades y metodos personalizados; mi problema reside en que al pegarlos en un form por ejemplo, quiero saber a que clase base pertenece un objeto, y ademas si ese objeto posee una propiedad o metodo determinado.
al hacer un for each por cada control de un form, saber que tipo de objeto es, cual es su base clase y si existe una propiedad o metodo determinado.
Gracias de antemano y saludos.
Todas las respuestas
-
jueves, 16 de febrero de 2012 21:30Moderador
ademas si ese objeto posee una propiedad o metodo determinado.
pero si el control hereda de una clase que tiene esa propiedad o metodo seguro la tendra
quiero saber a que clase base pertenece un objeto
no has probado usando
If objeto Is NombreClase Then
End If
tambien podrias usar
Dim obj As NombreClase = TryCast(instancia, NombreClase )
If obj IsNot Nothing Then
End If
como veras si el trycast devuelve nothing es que no es es clase
al hacer un for each por cada control de un form, saber que tipo de objeto es
For Each ctrl As Control In Me.Control
If ctrl Is TextBox Then
Dim text As TextBox = DirectCast(instancia, NombreClase )
End If
If ctrl Is Button Then
Dim btnAs Button = DirectCast(instancia, Button )
End If
Next
saludos
Leandro Tuttini
Blog
Buenos Aires
Argentina- Marcado como respuesta Enrique M. MontejoMVP, Moderator sábado, 19 de mayo de 2012 18:13
-
domingo, 19 de febrero de 2012 9:36Moderador
"Marlos E. Gomez" escribió:
> mi problema reside en que al pegarlos en un form por ejemplo,
> quiero saber a que clase base pertenece un objeto
>
> al hacer un for each por cada control de un form, saber que
> tipo de objeto es, cual es su base clase y si existe una
> propiedad o metodo determinado.Hola:
Si recorres el clásico bucle For Each para obtener el tipo de control (TypeOf Is TextBox), lo más seguro es que te tome como TextBox los controles que son de la clase TextBox más aquellos que dices que heredan de la clase TextBox, con lo que en principio no sabrías diferenciarlos, salvo que expresamente conviertas una referencia del control en su tipo de dato mediante el operador DirectCast, CType o TryCast.
Para conocer a qué clase en concreto pertenece un objeto, deberías de implementar una función que en base a un tipo de control en concreto te devuelva una lista genérica de aquellos controles que pertenecen a dicho tipo de clase, como así lo explica Lluis Franco en el siguiente artículo:
How to: Obtener controles de un formulario con generics
Traduciendo el código de C# a Visual Basic .NET, te quedaría la siguiente función:
''' <summary> ''' Obtiene una colección con los controles de un determinado ''' tipo existentes en un contenedor superior. ''' </summary> ''' <typeparam name="T">Tipo de control que se desea obtener.</typeparam> ''' <param name="parentContainer">Objeto Control que actua de ''' contenedor para el tipo de control que se desea obtener.</param> ''' <returns></returns> ''' <remarks></remarks> Public Function GetTypeControls(Of T As Control)(parentContainer As Control) As List(Of T) If (parentContainer Is Nothing) Then Return Nothing Dim controls As New List(Of T) For Each ctrl As Control In parentContainer.Controls If (TypeOf ctrl Is T) Then controls.Add(DirectCast(ctrl, T)) controls.AddRange(GetTypeControls(Of T)(ctrl)) Next Return controls End FunctionVamos a suponer que desear obtener una lista con los controles personalizados que heredan de TextBox, y que tienes insertados en el formulario donde actualmente se está ejecutando el código (Me). Obtendrías una lista genérica de la clase TextBoxEx (una clase que hereda de la clase TextBox) de la siguiente manera:
Dim lst As List(Of TextBoxEx) = GetTypeControls(Of TextBoxEx)(Me)
Es importante que cuando llames a la función 'GetTypeControls' le pases el tipo de dato específico del control, porque si le pasas el tipo de dato TextBox, te devolverá los controles TextBox más aquellos que heredan de TextBox.
Ahora, para conocer ciertos datos del control, necesitarás recurrir a las clases del espacio de nombres System.Reflection. Para ello, al comienzo del módulo o clase importarías dicho espacios de nombres:
Imports System.Reflection
Y cuando desees obtener la colección de controles que heredan de la clase TextBox que has diseñado ejecutarías:
Dim lst As List(Of TextBoxEx) = GetTypeControls(Of TextBoxEx)(Me)
If (lst.Count > 0) Then
' Referenciamos el primer elemento de la colección
'
Dim tb As TextBoxEx = lst(0)' Obtenemos su System.Type
'
Dim ty As Type = tb.GetType()' Obtenemos el tipo de su clase base
'
MessageBox.Show("Tipo Base: " & ty.BaseType.Name)Dim pi As PropertyInfo = ty.GetProperty("NombrePropiedad")
If (Not pi Is Nothing) Then
MessageBox.Show("Existe la propiedad llamada: " & pi.Name)Else
MessageBox.Show("No existe la propiedad especificada.")End If
Dim mi As MethodInfo = ty.GetMethod("NombreMetodo")
If (Not mi Is Nothing) Then
MessageBox.Show("Existe el método llamado: " & mi.Name)Else
MessageBox.Show("No existe el método especificado.")End If
End If
Y si deseas conocer los controles existentes en la colección, ahora sí podrás utilizar el clásico bucle For Each:
For Each ctrl As TextBoxEx In lst
MessageBox.Show(ctrl.Name)
NextEn fin, adapta el ejemplo a tus necesidades.
Un saludo
Enrique Martínez
[MS MVP - VB]Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.
Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.
Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.
- Marcado como respuesta Enrique M. MontejoMVP, Moderator sábado, 19 de mayo de 2012 18:13

