none
¿Cómo se puede determinar la clase que llamó a un método? (explico)

    Pregunta

  • Suponiendo que tengo un formulario con una propiedad de tipo MiClase:

    Public Class MiFormulario

    ...Property MiPropiedad As New MiClase

    .............................

    .............Resto de codigo del formulario

    .............................

    End Class

    y en otro módulo tengo definida MiClase que a su vez tiene un método MiMetodo()

    La consulta es cuando ejecuto: MiPropiedad.MiMetodo(), este se ejecuta desde MiFormulario que es donde se definió MiPropiedad.

    La consulta es:

    ¿Cómo determino dentro de MiMetodo() el objeto formulario desde el cual es llamado? (en este caso MiFormulario)


    En otras palabras cómo obtengo dentro de MiMetodo una referencia a MiFormulario sin necesidad de pasarle un parámetro.

    • Editado James-2016 viernes, 4 de noviembre de 2016 23:25
    viernes, 4 de noviembre de 2016 23:23

Respuestas

  • En forma basica, Inversion de control es un principio de programación donde la clase hija controla a la padre, en tu ejemplo, podrías crear un constructor a tu clase para que reciba un objeto Form

    Public Class MiClase

       Public Sub New(forma As Form)
            forma.Text = "xxxx"
        End Sub

    y desde el formulario la invocas pasando al creador

    Dim miclase As New MiClase(Me)

    De esta forma la clase hija puede hacer modificaciones a la clase padre.

    Saludos

    sábado, 5 de noviembre de 2016 2:39

Todas las respuestas

  • Hasta donde conozco, puedes obtener información de tipo usando stacktrace

    Dim stackTrace As New StackTrace()
    Dim llamador As String = stackTrace.GetFrame(1).GetMethod().Name

    pero no la instancia en ejecución.  

    La solución pasando la forma como parametro (inversión de control) pareciera ser el camino.

    viernes, 4 de noviembre de 2016 23:58
  • Gracias, veo que StackTrace funciona más o menos como parent en el caso de controles de formulario (en este caso sí una referencia al control que lo contiene).

    A qué se refiere con inversión de control?

    sábado, 5 de noviembre de 2016 1:42
  • En forma basica, Inversion de control es un principio de programación donde la clase hija controla a la padre, en tu ejemplo, podrías crear un constructor a tu clase para que reciba un objeto Form

    Public Class MiClase

       Public Sub New(forma As Form)
            forma.Text = "xxxx"
        End Sub

    y desde el formulario la invocas pasando al creador

    Dim miclase As New MiClase(Me)

    De esta forma la clase hija puede hacer modificaciones a la clase padre.

    Saludos

    sábado, 5 de noviembre de 2016 2:39
  • mm también podría declarar una variable a nivel de MiClase y en Sub New asignarle a esa variable la variable forma, de ese modo podría acceder al formulario y sus controles desde cualquier método dentro de MiClase.

    Me parece una buena alternativa, muchas gracias. Saludos.

    sábado, 5 de noviembre de 2016 3:09