Tengo varias clases estáticas en el espacio de nombres mySolution.Macros
como
static class Indent{
public static void Run(){
// implementation
}
// other helper methods
}
Entonces, mi pregunta es ¿cómo será posible llamar a esos métodos con la ayuda de la reflexión?
Si los métodos NO fueran estáticos, entonces podría hacer algo como:
var macroClasses = Assembly.GetExecutingAssembly().GetTypes().Where( x => x.Namespace.ToUpper().Contains("MACRO") );
foreach (var tempClass in macroClasses)
{
var curInsance = Activator.CreateInstance(tempClass);
// I know have an instance of a macro and will be able to run it
// using reflection I will be able to run the method as:
curInsance.GetType().GetMethod("Run").Invoke(curInsance, null);
}
Me gustaría mantener mis clases estáticas. ¿Cómo podré hacer algo similar con métodos estáticos?
En resumen, me gustaría llamar a todos los métodos Run de todas las clases estáticas que están en el espacio de nombres mySolution.Macros.
c#
reflection
dynamic
Tono Nam
fuente
fuente
GetMethod
.BindingFlags.Static
es posible que no pueda obtener el método con éxito en primer lugar ...Realmente, realmente, realmente podría optimizar mucho su código pagando el precio de crear el delegado solo una vez (tampoco es necesario crear una instancia de la clase para llamar a un método estático). He hecho algo muy similar, y simplemente guardo en caché un delegado del método "Ejecutar" con la ayuda de una clase auxiliar :-). Se parece a esto:
Es MUCHO más rápido de esta manera.
Si la firma de su método es diferente de Action, puede reemplazar las conversiones de tipo y typeof de Action por cualquiera de los tipos genéricos de Action y Func necesarios, o declarar su Delegado y usarlo. Mi propia implementación usa Func para imprimir objetos bonitos:
fuente
Prefiero la sencillez ...
Uso...
Pero en caso de que esté buscando algo un poco más robusto, incluido el manejo de excepciones ...
El uso es prácticamente el mismo ...
fuente