У меня есть несколько статических классов в пространстве имен, mySolution.Macros
таких как
static class Indent{
public static void Run(){
// implementation
}
// other helper methods
}
Итак, мой вопрос: как можно будет вызывать эти методы с помощью отражения?
Если методы НЕ должны быть статическими, я мог бы сделать что-то вроде:
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);
}
Я хочу, чтобы мои классы оставались статичными. Как я смогу сделать что-то подобное со статическими методами?
Короче говоря, я хотел бы вызвать все методы Run из всех статических классов, которые находятся в пространстве имен mySolution.Macros.
c#
reflection
dynamic
Тоно Нам
источник
источник
GetMethod
.BindingFlags.Static
вас невозможно успешно получить метод ...Вы действительно, действительно, действительно могли бы значительно оптимизировать свой код, заплатив цену за создание делегата только один раз (также нет необходимости создавать экземпляр класса для вызова статического метода). Я сделал что-то очень похожее, и я просто кэширую делегата метода "Run" с помощью вспомогательного класса :-). Выглядит это так:
Так происходит НАМНОГО быстрее.
Если подпись вашего метода отличается от Action, вы можете заменить приведение типов и typeof из Action на любой из необходимых универсальных типов Action и Func или объявить свой делегат и использовать его. Моя собственная реализация использует Func для красивой печати объектов:
источник
Я предпочитаю простоту ...
Использование...
Но если вы ищете что-то более надежное, включая обработку исключений ...
Использование почти такое же ...
источник