Invocando dinámicamente un método genérico
26 May 2010No 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: }