Почему можно было бы хотеть использовать AttributeUsage AllowMultiple при создании атрибутов?

Согласно книге я читаю, AllowMultiple общественная собственность AttributeUsage указывает:

... может ли цель иметь несколько экземпляров атрибута, относился к нему.

Почему был бы я хотеть/не хотеть использовать это?

17
задан Michael Petrotta 27 February 2014 в 18:25
поделиться

4 ответа

Атрибуты - это мета-данные. Обычно, вы захотите украсить члена или напечатать атрибут, чтобы отследить некоторую информацию о нем.

Например, в PropertyGrid для обозначения описания свойства используется ОписаниеАтрибут:

[Description("This is my property")]
public int MyProperty { get; set; }

В большинстве случаев, иметь более одного описания не имеет смысла.

Однако, возможно, что конкретный атрибут имеет смысл использовать более одного раза. В таком случае, вы захотите установить атрибут, чтобы позволить нескольким экземплярам себя пометить один и тот же атрибут.

(Не то чтобы я бы сделал это, но...) Скажем, вы сделали пользовательский атрибут, чтобы отслеживать основные изменения в классе. Вы можете захотеть перечислить это для каждого основного изменения:

[Changes(Version=1.1, Change="Added Foo Feature")]
[Changes(Version=2.0, Change="Added Bar Feature")]
public class MyClass
{
    // ...
22
ответ дан 30 November 2019 в 12:36
поделиться

Этот пример может быть немного надуманным, но, надеюсь, он перейдет всю суть.

[Convertable(typeof(Int32)), Convertable(typeof(Double))]
public class Test
{

}
5
ответ дан 30 November 2019 в 12:36
поделиться

Это зависит от того, что представляют собой атрибуты.

Например, можно сделать атрибут, который помечает класс как зависящий от чего-то, и можно разрешить множественные зависимости.

Для конкретного примера посмотрите на SuppressMessage, который подавляет предупреждение анализа кода. Член может иметь несколько предупреждений, которые вы можете захотеть подавить.

Другой пример - WebResource; ассемблера может содержать несколько ресурсов.

.
2
ответ дан 30 November 2019 в 12:36
поделиться

Здесь нет надуманного примера, я использовал его в реальном производственном коде. Я написал код для разбора файла, содержащего пары данных типа (code=value). Я поместил на функцию пользовательский атрибут, чтобы указать, что он должен вызываться для данного кода.

[CanParseCode("G1")]
[CanParseCode("G2")]
private void ParseGXCodes(string code, string value)
{
   ...
}

Этот специфический формат немного старый и специфичный для данной области с сотнями различных кодов. Моей целью было написать фреймворк, чтобы облегчить написание файловых процессоров, которые могли бы извлекать только нужные ей коды, а остальное игнорировать. Разрешение одного и того же атрибута несколько раз упростило выражение намерения кода, просто объявив атрибуты на функции, обрабатывающие каждый код.

.
1
ответ дан 30 November 2019 в 12:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: