J'ai plusieurs classes statiques dans l'espace de noms mySolution.Macros
telles que
static class Indent{
public static void Run(){
// implementation
}
// other helper methods
}
Ma question est donc de savoir comment il sera possible d'appeler ces méthodes à l'aide de la réflexion?
Si les méthodes ne sont PAS statiques, je pourrais faire quelque chose comme:
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);
}
J'aimerai garder mes classes statiques. Comment pourrai-je faire quelque chose de similaire avec des méthodes statiques?
En bref, j'aimerais appeler toutes les méthodes Run de toutes les classes statiques qui se trouvent dans l'espace de noms mySolution.Macros.
la source
GetMethod
.BindingFlags.Static
vous risquez de ne pas réussir à obtenir la méthode en premier lieu ...Vous pouvez vraiment, vraiment, vraiment optimiser beaucoup votre code en payant le prix de la création du délégué une seule fois (il n'est pas non plus nécessaire d'instancier la classe pour appeler une méthode statique). J'ai fait quelque chose de très similaire, et je mets juste en cache un délégué à la méthode "Run" à l'aide d'une classe d'assistance :-). Cela ressemble à ceci:
C'est BEAUCOUP plus rapide de cette façon.
Si votre signature de méthode est différente de Action, vous pouvez remplacer les types-cast et typeof de Action par l'un des types génériques Action et Func nécessaires, ou déclarer votre Delegate et l'utiliser. Ma propre implémentation utilise Func pour imprimer de jolis objets:
la source
Je préfère la simplicité ...
Usage...
Mais au cas où vous cherchez quelque chose d'un peu plus robuste, y compris la gestion des exceptions ...
L'utilisation est à peu près la même ...
la source