none
El valor no puede ser nulo RRS feed

  • Pregunta

  • Tengo problemas con el siguiente código. El error está en Types de la varible metodo.

    'Con el siguiente orden los elementos son:
                    'ME, LISTBOX1, PICTUREBOX1, Form2, Form2.PROGRESSBAR1, FolderBrowserDialog1.SelectedPath
                    Dim CarImaProp As Type() = {Type.GetType("System.Windows.Forms.Form"), Type.GetType("System.Windows.Forms.ListBox"), Type.GetType("System.Windows.Forms.PictureBox"), _
                                Type.GetType("System.Windows.Forms.Form"), Type.GetType("System.Windows.Forms.ProgressBar"), Type.GetType("System.String")}
    
                    Dim metodo As Reflection.MethodInfo = _
                    CLS1.GetMethod("CargarImágenes", BindingFlags.Public Or BindingFlags.Instance, Nothing, CarImaProp, Nothing) 'CLS1 es el nombre de la clase, CarImaProp el funcion.


    Si la contestación te ha servido de ayuda márcala como respuesta. Si lo que publico no funciona, no tengo la culpa, SOY HUMANO, no una máquina.

    viernes, 17 de octubre de 2014 17:03

Respuestas

  • "LTNs" escribió:

    > Tengo problemas con el siguiente código. El error está en Types de la varible metodo.
    >
    > 'Con el siguiente orden los elementos son:
    > 'ME, LISTBOX1, PICTUREBOX1, Form2, Form2.PROGRESSBAR1, FolderBrowserDialog1.SelectedPath
    >  Dim CarImaProp As Type() = { _
    >    Type.GetType("System.Windows.Forms.Form"), _
    >    Type.GetType("System.Windows.Forms.ListBox"), _
    >    Type.GetType("System.Windows.Forms.PictureBox"), _
    >    Type.GetType("System.Windows.Forms.Form"), _
    >    Type.GetType("System.Windows.Forms.ProgressBar"), _
    >    Type.GetType("System.String")}

    ¡Y tanto que tienes problemas! ¿Pero cómo pretendes obtener el System.Type de las clases Form, ListBox, PictureBox y ProgressBar mediante el método compartido GetType de la clase System.Type?

    Con la función Type.GetType el único Type que puedes obtener es el de la clase System.String. Para las demás clases tienes que referenciar el ensamblado System.Windows.Forms. Es decir, que tendrías que ejecutar algo parecido a lo siguiente:

        Dim asm As Assembly = 
           Assembly.LoadFile("C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Windows.Forms.dll")
    
        Dim CarImaProp As Type() = _
                {asm.GetType("System.Windows.Forms.Form"), _
                 asm.GetType("System.Windows.Forms.ListBox"), _
                 asm.GetType("System.Windows.Forms.PictureBox"), _
                 asm.GetType("System.Windows.Forms.Form"), _
                 asm.GetType("System.Windows.Forms.ProgressBar"), _
                 Type.GetType("System.String")}

    Con ello obtendrías los Types de las clases correspondiente a los controles especificados, que obviamente no son los de tu aplicación.

    Pero como parece ser que tu deseas referenciar mediante reflexión formularios y controles de tu propia aplicación, en principio tendrás que referenciar el propio ensamblado de tu aplicación:

            ' Obtenemos el ensamblado que contiene el código
            ' que se está ejecutando actualmente.
            '
            Dim asm As Assembly = Assembly.GetExecutingAssembly()

    Y solamente podrás referenciar los formularios existentes en el mismo, es decir, las clases Form1, Form2, FormClientes, etc., existentes en el mismo ensamblado. No podrás referenciar los controles existentes en los formularios porque éstos no son clases pertenecientes a tu ensamblado ya que se incluyen dentro del ensamblado como instancias de la clase ListBox, PictureBox, ProgressBar, etc.

            Dim CarImaProp As Type() = _
                {asm.GetType("WindowsApplication1.Form1"), _
                 asm.GetType("WindowsApplication1.Form2"), _
                 Type.GetType("System.String")}

    Para obtener una referencia de los controles mediante reflexión, una vez referenciado el formulario, tendrás que consultar también mediante reflexión su propiedad Controls para obtener el System.Type de cada control en particular. ¡Un verdadero jaleo si no tienes demasiada experiencia con la reflexión!

    La verdad es que ignoro por completo qué es lo que deseas hacer con la reflexión, pero te deseo mucha suerte si tu intención es referenciar controles mediante dicha técnica de programación. ;-)

    Si por casualidad tu intención es referenciar mediante reflexión formularios y controles existentes en otro ensamblado diferente, en principio podrás referenciar las clases cuyo ámbito de visibilidad sea Public, y los controles existentes en los formularios cuya propiedad Modifiers también sea Public, porque no pretenderás obtener mediante reflexión acceso a un control con un ámbito de visibilidad Private o Friend.

    Precisamente se recomienda que el ámbito de visibilidad de los controles sea Private, o como mucho Friend, para que no se pueda referenciar el control mediante reflexión desde fuera del ensamblado donde se encuentra definido. ;-)


    Enrique Martínez Montejo
            [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, se inteligente y activa la instrucción
    Option Strict.



    viernes, 17 de octubre de 2014 18:59
    Moderador