Объедините несколько атрибутов в один атрибут - PullRequest
0 голосов
/ 14 ноября 2018

Можно ли объединить несколько атрибутов только с одним?

Скажите, что у меня есть это свойство с [Display] и [JsonProperty]

[Display(Name = "String", Description = "A string", Order = 0)]
[JsonProperty]
public string StringProperty { get; set; }

Могу ли я создать новый атрибут [DisplayAndJsonProperty], который как-то реализует оба атрибута, чтобы я мог использовать его вместо этого, как показано ниже?

[DisplayAndJsonProperty(Name = "String", Description = "A string", Order = 0)]
public string StringProperty { get; set; }

В моем случае я использую базовый класс, украшенный [JsonObject(MemberSerialization.OptIn)], для управления сериализацией, а затем мне нужно украсить все свойства, которые я хочу сериализовать, с помощью [JsonProperty]

1 Ответ

0 голосов
/ 14 ноября 2018

Обычно ответ таков: вы не можете этого сделать.

Атрибут - это просто «маркер» для каркаса.Он указывает каркасу, как обращаться с классом, методом, свойством, параметром и т. Д. Особым образом.Но это не меняет поведение оформленного кода.

Атрибуты являются частью каркаса .Позвольте мне привести пример с 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 ), которые заменили бы ваш пользовательский атрибут на нужные атрибуты.Хотя не уверен, есть ли какие-либо из готовых решений.

Лично я бы сделал это простым и явным и использовал оригинальные атрибуты.Я буду более читабельным, особенно для новых членов команды.И, очевидно, это не потребует хаков после компиляции:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...