Ich habe mehrere statische Klassen im Namespace mySolution.Macros
wie
static class Indent{
public static void Run(){
// implementation
}
// other helper methods
}
Meine Frage ist also, wie es möglich sein wird, diese Methoden mit Hilfe der Reflexion aufzurufen.
Wenn die Methoden NICHT statisch sein sollten, könnte ich so etwas tun:
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);
}
Ich möchte meine Klassen statisch halten. Wie kann ich mit statischen Methoden etwas Ähnliches tun?
Kurz gesagt, ich möchte alle Run-Methoden aus allen statischen Klassen aufrufen, die sich im Namespace mySolution.Macros befinden.
c#
reflection
dynamic
Tono Nam
quelle
quelle
GetMethod
.BindingFlags.Static
Sie kann die Methode überhaupt nicht erfolgreich bekommen ...Sie können Ihren Code wirklich, wirklich, wirklich optimieren, indem Sie den Preis für das Erstellen des Delegaten nur einmal bezahlen (es ist auch nicht erforderlich, die Klasse zu instanziieren, um eine statische Methode aufzurufen). Ich habe etwas sehr Ähnliches gemacht und nur einen Delegierten mit Hilfe einer Hilfsklasse für die "Run" -Methode zwischengespeichert :-). Es sieht aus wie das:
Auf diese Weise ist es VIEL schneller.
Wenn sich Ihre Methodensignatur von Action unterscheidet, können Sie die Typumwandlungen und Typeof von Action durch einen der erforderlichen generischen Action- und Func-Typen ersetzen oder Ihren Delegaten deklarieren und verwenden. Meine eigene Implementierung verwendet Func, um Objekte hübsch zu drucken:
quelle
Ich bevorzuge Einfachheit ...
Verwendung...
Aber für den Fall, dass Sie etwas Robusteres suchen, einschließlich der Behandlung von Ausnahmen ...
Die Nutzung ist ziemlich gleich ...
quelle