Invocando dinámicamente un método genérico

No sé si es debido a un bug o simplemente es algo a lo que no hay modo sencillo de dar soporte, pero el caso es que los accessors que podemos utilizar en los proyectos de testing en Visual Studio 2008, no son capaces de invocar métodos que sean privados, estáticos y genéricos (a la vez).

Una posible solución (desconozco si hay más y más sencillas) es la invocación de estos métodos en nuestros tests mediante Reflection. Con este tipo de fragmentos de código vuelves una y otra vez a por ellos según vas pasando de proyecto en proyecto, aquí queda para el futuro.

 

   1:  // Obtener el MethodInfo asociado al metodo a invocar
   2:  MethodInfo methodInfo = typeof(ClassToInvoke).GetMethod(
   3:      "MethodToInvoke", System.Reflection.BindingFlags.Static | BindingFlags.Public);
   4:   
   5:  // Bindear el tipo con el metodo que queremos invocar
   6:  Type[] genericArguments = new Type[] { genericType };
   7:  MethodInfo genericMethodInfo = methodInfo.MakeGenericMethod(genericArguments);
   8:   
   9:  // Invocar el metodo y pasarle los parametros necesarios
  10:  // El parametro null es el objeto desde el que se invoca el metodo. 
  11:  // Al ser un estatico, debe ser null
  12:  try
  13:  {
  14:      genericMethodInfo.Invoke(null, new object[] { value1, value2 });
  15:  }
  16:  catch (TargetInvocationException ex)
  17:  {
  18:      // Cualquier excepción lanzada por el método irá wrappeada dentro 
  19:      // de una TargetInvocationException
  20:      if (ex.InnerException != null)
  21:      {
  22:          throw ex.InnerException;
  23:      }
  24:      else
  25:      {
  26:          throw;
  27:      }
  28:  }