.net - resolucion - solucion de problemas y toma de decisiones ejemplos
¿Hay una buena manera de obtener MethodInfo del método genérico abierto? (2)
Considera un tipo como este
public interface IHaveGenericMethod
{
T1 Method<T1>(T1 parm);
T2 Method<T1,T2>(T1 parm);
int Method2(int parm);
}
¿Cómo obtengo un methodInfo para sus métodos? para un método regular no genérico, como method2, puedo ir con
typeof(IHaveGenericMethod).GetMethod("methodName",new Type[]{typeof(itsParameters)});
para un método genérico, no puedo, ya que sus parámetros no son tipos per se. Entonces, ¿cómo hago eso? Sé que puedo llamar
typeof(IHaveGenericMethod).GetMethods()
para obtener todos los métodos de ese tipo, y luego iterar sobre esa colección y hacer algunas coincidencias, pero es feo. ¿Hay una mejor manera?
Bueno, son tipos, de tipo:
foreach (var method in typeof(IHaveGenericMethod).GetMethods())
{
Console.WriteLine(method.Name);
if (method.IsGenericMethodDefinition)
{
foreach (Type type in method.GetGenericArguments())
{
Console.WriteLine("> " + type.Name);
}
}
}
Entonces puede verificar por el número de argumentos y verificar la firma. Pero nada más limpio.
Asegúrese de consultar la página de MSDN " Reflection and Generic Types ".
ya que sus parámetros no son tipos per se
En realidad, creo que es porque desea consultar los parámetros de tipo , pero la lista de tipos que puede proporcionar a GetMethod()
no es para los parámetros de tipo.
Además, recuerde que todo lo que necesita para seleccionar un "grupo de métodos" de métodos genéricos es conocer la cantidad de parámetros genéricos. Entonces puedes contarlos.
luego iterar
No iterar, consultar:
var mi = from mi in typeof(IHaveGenericMethod).GetMethods()
where mi.Name == "Method"
where mi.IsGenericMethodDefinition
where mi.GetGenericArguments().Length == 2
select mi;