Mam kilka klas statycznych w przestrzeni nazw, mySolution.Macros
takich jak
static class Indent{
public static void Run(){
// implementation
}
// other helper methods
}
Więc moje pytanie brzmi: jak będzie można nazwać te metody za pomocą refleksji?
Jeśli metody NIE mają być statyczne, mógłbym zrobić coś takiego:
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);
}
Chciałbym, aby moje zajęcia były statyczne. Jak będę mógł zrobić coś podobnego za pomocą metod statycznych?
Krótko mówiąc, chciałbym wywołać wszystkie metody Run ze wszystkich klas statycznych w przestrzeni nazw mySolution.Macros.
c#
reflection
dynamic
Tono Nam
źródło
źródło
GetMethod
.BindingFlags.Static
ciebie może się nie udać dostać metody na pierwszym miejscu ...Naprawdę, naprawdę, naprawdę można bardzo dużo zoptymalizować swój kod, płacąc cenę za utworzenie delegata tylko raz (nie ma również potrzeby tworzenia instancji klasy w celu wywołania metody statycznej). Zrobiłem coś bardzo podobnego i po prostu buforowałem delegata do metody „Run” przy pomocy klasy pomocniczej :-). To wygląda tak:
W ten sposób jest DUŻO szybszy.
Jeśli Twoja sygnatura metody różni się od Action, możesz zamienić rzutowania typu i typeof z Action na dowolny z wymaganych typów generycznych Action i Func lub zadeklarować delegata i użyć go. Moja własna implementacja używa Func do ładnego drukowania obiektów:
źródło
Wolę prostotę ...
Stosowanie...
Ale jeśli szukasz czegoś bardziej niezawodnego, w tym obsługi wyjątków ...
Użycie jest prawie takie samo ...
źródło