Reflection C#

Bueno esta vez si que casi me suicido de la colera por no poder hacer una tonteria que en Visual Foxpro la hacia parpadeando con macrosustitucion, bueno el problema era este:

Se tienen que ejecutar los metodos de objetos que se pasan como parametros hacia la clase X en el constructor el problema viene en que no se sabe de que clase se trata ya que las clases varian vengaque voy a explicar mejor de que trata este proyecto que me ha obligado a leerme un par de capitulos de libros sobre Reflection y en cima despues de todo termino siendo tan sencilla la codificacion que :@ pero valio la pena el aprendizaje (eso pasa cunado te crees saber todo y sabes que siempre te falta)

La cosa es que estoy desarrollando una forma facil de hacer formularios para mis sistemas de gestion como es sabido por todos siempre estan los mantenimientos de tablas (agregar, quitar, modificar) estos mantenimientos los hago con dos formularios uno donde muestro una grilla (cuadricula, datagrid, o como lo llamen) y el otro que aparece cuando se preciona en Agregar o modificar ya con sus textbox, combos, checks y demas objetos que correspondan. Como veran las acciones son siempre las mismas si se llamo de agregar pues insertar el registro, si se llamo de editar pues actualizar el registro, si se preciona eliminar pues mostrar el registro y preguntar si lo quiere borrar y ejecutar la respuesta, la cosa es que como trabajo en capas se me hace facil hacer que cada el agregar ejecute el metodo de la capa de negocios que valida y llmaa al agregar con los parametros requeridos, pero lo que se queria era sin saber de que clase era se jecutar el metodo «vertodos» que esta en todas mis clases de cierta capa y lo que hace es que me trae todos los registros (esto por decir algo ya que podria ejecutar traersolo o traerXregistros que son funciones implemenetadas en todas las clases, se que deberia haber usado generics para eso pero bueno el generador de estas clases esta hecho y ya me dare tiempo en reprogramarlo) bueno pues al grano, como soy medio bruto no hallaba la manera de hacerlo hasta que despues de una tarde frustracion y muchas horas de estudio y pruebas y requetepruebas he llegado a esto:

Type t = para.ONegocios.GetType();
MethodInfo metodo = t.GetMethod("vertodos");
Object objreflex = metodo.Invoke(para.ONegocios, null);
dsdatos = (DataSet)objreflex;

 Lo voy a explicar, lo primero creo un tipo del objeto «ONegocios» que en verdad esta definido de esta manera en a clase parametros:

private Object oNegocios;

Como ven no se tiene el tipo exacto solo un objeto de tipo Object generico por eso en «t» creo el tipo verdadero que corresponde a mi clase de negocios.

public Object ONegocios
{
get { return oNegocios; }
set { oNegocios = value; }
}

COn la linea MethodInfo metodo = t.GetMethod(«vertodos»); pues no hay secretos en esto le estoy diciendo que me creo un objeto de tipo MethodInfo que luego uso para invocar en la linea siguiente y todo funciona.

Solo una cosa si tu metodo tiene parametros y no es estatico pues no hagas lo que yo y eso me tardo unos minutos mas desperdiciados:

Object objreflex = metodo.Invoke(null, null);
eso puse y me daba un error del que no hay mucho que leer en internet y te dira esto «Non-static method requires a target» (yo uso VS en ingles por que esa licencia tengo) lo que pasa es que me esta diciendo que no puede ejecutar sin referencia de objeto o parametros para los parametros se tiene que usar un array de objetos que representen a cada valor de tus parametros, esto de los parametros lo toco en otro post.
Bueno, de felicidad de haber hecho funcionar mi crerador de formularios de mantenimientos me voy a por una cerveza.

Acerca de

Antes que nada voy a dejar en claro algo, en este blog escribo como se me place, asi que no busquen errores de ortografia o de redaccion que los van a encontrar a montones y tampoco me critiquen o me digan nada sobre ellos pues no tengo intencion alguna de cambiarlos, lo que escribo lo dejo asi y no lo corrijo,claro esta a menos que sean lineas de codigo. Jorge Prado Anci, profesional en desarrollo de aplicaciones, en especial las dirigidas a bases de datos. He trabajado con VFP en casi todas sus versiones, se algo de Java (que no me gusta, es eso solo no me gusta, es bueno pero no me gusta), lo suficiente de PHP como para tener mi propio CMS(es que sigue sin gustarme por la capacidad de desorden que te permite este “lenguaje”), VB lo conoci y lo deteste tanto que lo olvide al punto de no querer adoptar ni por obligacion a su reemplazante VB .NET (por lo mismo de Java) y si C# este si me encanta y aun que conozco bastante bien el lenguaje, la verdad es que me falta mucho del Framework (del 100% estare en un 65%). Soy un apasionado por el orden (en los proyectos de desarrollo), de la programacion en capas (de MVC conozco pero no he aplicado mucho), los estandares y las condenadas pruebas unitaria. Venga creo que ya con esto fue suficiente.

Tagged with: , , ,
Publicado en c#
4 comments on “Reflection C#
  1. Kleytman Aular dice:

    Bueno… interesante tu post, solo te recomiendo que si quieres ser un poco mas profesional trates de mejorar tu ortografía, pues tienes unos errores que son imposibles dejar pasar («profecional», «apacionado») ????

  2. Rodrigo dice:

    Muy buena la información, gracias por compartir tus conocimientos, y tienes razón, con el poco tiempo que la gente que hace software dispone, y todavía uno lo invierte para que gente se beneficie, pero hay gente que en lugar de agradecer, se fija en pelotudeces.

  3. Kasey dice:

    Hurrah, that’s what I was seeking for, what a stuff! existing here at this weblog, thanks admin of this website.

  4. Stefan dice:

    Hi, just wanted to say, I enjoyed this article. It was
    inspiring. Keep on posting!

Replica a Rodrigo Cancelar la respuesta

Escribe tu dirección de correo electrónico para suscribirte a este blog, y recibir notificaciones de nuevos mensajes por correo.

Únete a otros 468 suscriptores
Blog Stats
  • 415.649 hits