Invocar métodos dinámicamente conocidos en tiempo de ejecución

    La mayoria de ocasiones sabremos qué métodos invocar antes de la compilación, por lo tanto, podemos invocar directamente al método con sus parámetros, pero habrá ocasiones en las que esto no sea así y necesitemos invocarlos dinámicamente en tiempo de ejecuación.


    Por ejemplo, imaginemos que tenemos una clase llamada Calculadora que contiene un método para cada tipo de operación (Suma, Resta, Multiplicacion y Division) y solo sabremos durante la ejecución de nuestro programa el método que tenemos que llamar. ¿Qué harias si en un momento necesitamos ejecutar el método Suma con los parámetros 2 y 3, sabiendo unicamente el string “Suma” y el int 2 y 3 ?


    Este problema lo podemos solucinar utilizando el espacio de nombres Reflection, mediante el uso del método InvokeMember en el objeto Type.


    El método InvokeMember acepta los siguientes parámetros: nombre del método a invocar, una seria de flags de invocación, un atributo con una seria de propiedades de la misma, el objeto sobre el que se realiza la invocación y un arraya de object que contienen los parámetros del método. Para más información de los parámetros ver aquí.


    Un ejemplo seria el siguiente:



string metodo = Console.ReadLine(); //Recogemos por teclado el nombre del método a ejecutar.


int op1 = Convert.ToInt32(Console.ReadLine()); //Recogemos el primer operando


int op2 = Convert.ToInt32(Console.ReadLine()); //Recogemos el segundo operando


Type tipoObjeto = typeof(Calculadora); //Obtenemos el tipo del objeto calculadora.


object[] parametros = new object[] { op1, op2 };


int resultado = (int)tipoObjeto.InvokeMember(metodo, BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod, null, pedroCalculadora, parametros);


Console.WriteLine(resultado); //Imprimimos por pantalla el resultado


 


      Del mismo modo podemos trabajar con las propiedades de un objeto, simplemente llamaremos al método GetProperty el cual acepta como parámetro el nombre de la propiedad y nos retorna un PropertyInfo a y con este objeto ya podemos acceder al metodo get de esta propiedad. Como mejor lo veremos es con un ejemplo. Imaginemos que en la clase Calcualdora del ejemplo anterior tenemos una propiedad para el nombre llamada Nombre y queremos acceder al Get de la misma en ejecuación simplemente conociendo el nombre de la propiedad:


 



Type tipoObjeto = typeof(Calculadora); //Obtenemos el tipo del objeto calculadora.


PropertyInfo propiedadInfo= tipoObjeto.GetProperty(“Nombre”);//Obtenemos la propiedad que queremos.


MethodInfo metodoInfo = propiedadInfo.GetGetMethod();//Obtenemos el método de la propiedad.


string resultado = (string)metodoInfo.Invoke(pedroCalculadora, new object[0]);


Console.WriteLine(resultado); //Imprimimos por pantalla el resultado


 


El resultado será el nombre de la calculadora y lo hemos obtenido conociendo el nombre de la propiedad.

pedro posted at 2007-8-27 Category: Sin categoría