Как написать метод, который будет выполняться перед каждым другим методом?
Есть метод A и методы B,С,D,E.
Нужно метод A выполнить перед каждым методом B,С,D,E, когда они будут запускаться и если метод A будет false, то выйти и не выполнять следующий код.
Фактически нужно вписать выполнение метода А в каждый из методов.
Но есть ли какой-то лучшей способ обёртки, что б не прописывать одинаковые действия в каждом из методов и наследовать класс А (с методом А) и пропускать всё через него?
Создаете свой атрибут, где внутри будет отрабатывать Ваш метод А и декарируете методы B,С,D,E этим атрибутом. Каждый раз, перед тем как метод будет запускаться, сначала отработает тот, что в атрибуте.
Роман, Через атрибуты можно сделать декоратор, но метод придётся вызывать хитрожопым образом, сначала искать атрибут на нём через рефлексию, потом доставать из него информацию о другом методе и так далее.
Года три назад я решал подобную задачу, когда с помощью атрибутов я указывал как метод должен отработать. Как по Вашему работает атрибут Authorize? Все Permision?
Конечно нужно руками код добавить, можно внутри класса рефлексией атрибуты проверять и их значения или какой то статический метод добавить. Если просто по выдачи объектов, то можно фабрику создать, которая будет атрибут проверять, прежде чем дать экземпляр. Вариантов куча как это использовать. Вы будете неделю искать готовые варианты, причитать, что такого функционала нет, городить огороды, чем просто самому написать 10 строк кода. И после этого сравните стоимость работы.
eRKa, посмотрите для начала сам класс System.Attribute, в нем даже нет никакого виртуального метода который выполняется перед выполнением помеченного метода. Authorize работает так, роутер разбирает строку запроса, выбирает контроллер-метод, потом смотрит наличие атрибута, проверяет возможность доступа и потом только вызывается метод контроллера, уточняю, роутер проверяет. Вот вам исходник AuthorizeAttribute https://github.com/aspnet/Security/blob/dev/src/Mi... там даже ни одного метода нет то. Может вы меня не поняли, присвоение только атрибута ничего не сделает, может мы не поняли друг друга, но ответ звучит так, что достаточно написать свой атрибут им помечать методы и все будет работать.
Даниил Басманов, ответ почитайте товарища eRKa, звучит как, достаточно написать атрибут, пометить метод и все. естественно нужна какая-то обертка, например как это сделано в Fody.PropertyChanged, там идет кодогенерация и внедрение кода после компиляции.
Роман, Я в курсе как устроен Authorize) , я использую кастомные атрибуты в работе. Я действительно не расписал до мелочей, но все правильно - "присвоение только атрибута ничего не сделает". Я просто дал наводку с помощью чего можно решить эту задачу, с посылом на то, что дальше человек просто загуглит работу с атрибутами.