Обычно ответ таков: вы не можете этого сделать.
Атрибут - это просто «маркер» для каркаса.Он указывает каркасу, как обращаться с классом, методом, свойством, параметром и т. Д. Особым образом.Но это не меняет поведение оформленного кода.
Атрибуты являются частью каркаса .Позвольте мне привести пример с ASP.Net.
class SomeController : Controller {
[HttpPost("/api/do-something")]
public void SomeAction([FromBody] SomeData someData){
...
}
}
Оба атрибута [HttpPost]
и [FromBody]
относятся к инфраструктуре ASP.Net.То, что мы сделали выше, по сути, говорят:
«Привет, ASP.Net, когда кто-нибудь отправляет запрос POST на URL« / api / do-что-то », создает экземпляр класса SomeController
и вызывает метод SomeAction
это (благодаря [HttpPost("/api/do-something")]
). При вызове метода возьмите все, что находится в теле запроса, проанализируйте его в объекте SomeData
и передайте объект в SomeAction
. (благодаря [FromBody]
) "
ASP.Net с помощью отражения находит все действия и сопоставляет их с маршрутами.Как?В этом случае он ищет методы с атрибутом [HttpPost]
.
Если вы используете свой собственный, настраиваемый атрибут, он не будет частью платформы, поэтому среда не будет знать об этом иследовательно, не будет уважать его.
Вы, возможно, могли бы использовать некоторые инструменты посткомпиляции (например, PostSharp ), которые заменили бы ваш пользовательский атрибут на нужные атрибуты.Хотя не уверен, есть ли какие-либо из готовых решений.
Лично я бы сделал это простым и явным и использовал оригинальные атрибуты.Я буду более читабельным, особенно для новых членов команды.И, очевидно, это не потребует хаков после компиляции:)