none
usar reflexion para instanciar una clase y ejecutar un metodo de ese objeto instanciado RRS feed

  • Pregunta

  • quiero instanciar un objeto  a parrtir de un tipo determinado que tengo en una propiedad string y en otra propiedad tengo el metodo que ejecuto
    clase:
            pclase: clase que quiero instanciar
            pmetodo: metodo que quiero ejecutar
     
    alguien puede ayudarme con esto, yo he usaso en un caso reflexion para poder instanciar un formulario que tenia en una variable string y ejecutar el metdoo show porque al objeto lo habia declarado del tipo form

    por lo general estas clases que quiero instanciar son clases de negocio y quiero ejecutar un metodo de ellas, por eso las tengo como parametros en una clase

    gracias
    programador
    viernes, 19 de febrero de 2010 11:22

Respuestas

  • Buenas:

    Antes que nada usar el namespace
    using System.Reflection;

    Esta es una forma buscando dentro de las clases y uan vez encontrada buscar dentro de los metodos.

    Type[] types = Assembly.GetExecutingAssembly().GetTypes();
    
    foreach (Type t in types)
    {
        if (t.Name == "nombreclase")
        {
            MethodInfo[] methods = t.GetMethods();
            foreach (MethodInfo m in methods)
            {
                if (m.Name == "nombremetodo")
                {
                    m.Invoke(this, null);
                }
            }
        }
    }
    Sino lo que puedes hacer es directamente obtener la clase que buscas

    Type t = Assembly.GetExecutingAssembly().GetType("nombreclase");

    Y despues directamente el metodo que queres buscar

     MethodInfo m = t.GetMethod("nombremetodo");
     m.Invoke(this, null);

    Espero que te sirva.
    Saludos

    Sparow


    • Marcado como respuesta rodrigo barboni viernes, 19 de febrero de 2010 18:13
    viernes, 19 de febrero de 2010 12:32
  • hola

    una forma simple para ahcer eso es por medio de

    Activator.CreateInstance Method (Type)

    se que tu tienes solo un string con el nombre de la clase a ejecutar

    pero puedes hacer

    Type type = Type.GetType(name);

    en dodne name es el nombre completo, o sea namespace y nombre de la clase

    BaseClass instancia = (BaseClass)Activator.CreateInstance(type, true);

    por lo general para poder usarla se debe acstear a una clase base o interfaz para poder conocer los metodos a ejecutar
    o sea sabiendo la interfaz puedes tener muchas implementaciones distintas


    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    viernes, 19 de febrero de 2010 12:33

Todas las respuestas

  • Buenas:

    Antes que nada usar el namespace
    using System.Reflection;

    Esta es una forma buscando dentro de las clases y uan vez encontrada buscar dentro de los metodos.

    Type[] types = Assembly.GetExecutingAssembly().GetTypes();
    
    foreach (Type t in types)
    {
        if (t.Name == "nombreclase")
        {
            MethodInfo[] methods = t.GetMethods();
            foreach (MethodInfo m in methods)
            {
                if (m.Name == "nombremetodo")
                {
                    m.Invoke(this, null);
                }
            }
        }
    }
    Sino lo que puedes hacer es directamente obtener la clase que buscas

    Type t = Assembly.GetExecutingAssembly().GetType("nombreclase");

    Y despues directamente el metodo que queres buscar

     MethodInfo m = t.GetMethod("nombremetodo");
     m.Invoke(this, null);

    Espero que te sirva.
    Saludos

    Sparow


    • Marcado como respuesta rodrigo barboni viernes, 19 de febrero de 2010 18:13
    viernes, 19 de febrero de 2010 12:32
  • hola

    una forma simple para ahcer eso es por medio de

    Activator.CreateInstance Method (Type)

    se que tu tienes solo un string con el nombre de la clase a ejecutar

    pero puedes hacer

    Type type = Type.GetType(name);

    en dodne name es el nombre completo, o sea namespace y nombre de la clase

    BaseClass instancia = (BaseClass)Activator.CreateInstance(type, true);

    por lo general para poder usarla se debe acstear a una clase base o interfaz para poder conocer los metodos a ejecutar
    o sea sabiendo la interfaz puedes tener muchas implementaciones distintas


    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    viernes, 19 de febrero de 2010 12:33
  • una pregunta mas sobre este tema, yo tengo una solucion  dividida en varias dll: una para la capa de datos, otra para la capa de negocio, una dll para guardar controles y clases generales y la interfaz winform donde agrego como referencia alguna de esas clases

    si quiero instanciar una clase de la capa de negocio que esta en la dll bus.dll y esta como agregada como referencia al proyecto winform, puedo usar directamente esta forma o tengo que tener en cuneta algo mas para poder instanciarla?


    programador
    viernes, 19 de febrero de 2010 17:56
  • hola

    si tienes una referencia puedes usarla directamente

    solo declara el using con el namespace y eso es todo si las clases on puclicas tendras acceso a su funcionalidad

    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    viernes, 19 de febrero de 2010 18:08
  • gracias leandro, cada paso que doy encuentro algo por aprender, en este lenguaje hay una gran teoria para cada cosa que queremos hacer y a veces uno no lee lo suficiente o lees y no entendes todo pero gracias a la gente capa y experementada que hay en el foro uno puede seguir proque la ayuda que dan es muy valiosa
    saludos...


    programador
    viernes, 19 de febrero de 2010 18:23