Respondida 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:30
    Moderador
     
     Respondida

    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

  • domingo, 19 de febrero de 2012 9:36
    Moderador
     
     Respondida Tiene código

    "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 Function

    Vamos 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)
            Next

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