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

StackOverflow https://stackoverflow.com/questions/2017661

Вопрос

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

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

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

Это было полезно?

Решение

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

Например, атрибут DescriptionAttribute используется 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
{
    // ...

Другие советы

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

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

}

Это зависит от того, какие атрибуты.

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

Конкретный пример см. SuppressMessage, который подавляет предупреждение анализа кода.У участника может быть несколько предупреждений, которые вы, возможно, захотите подавить.

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

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

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

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

Реальное применение атрибута AllowMultiple=истинная полезность

[ManagesType(typeof(SPEC_SEC_OC), true)]
[ManagesType(typeof(SPEC_SEC_04_OC), true)]
public class LibSpecSelectionView : CustomView
{
    public LibSpecSelectionView(SPEC_SEC_OC)
    {}
    public LibSpecSelectionView(SPEC_SEC_O4_OC)
    {}
    ....
}

public static class ViewManager
{
   ...  static Dictionary of views built via reflection
   public void LaunchView(this CollectionBaseClass cbc)
   {
       ... Find class registered to handle cbc type in dictionary and call ctor
   }
}

SPEC_SEC_OC myOC = DataClient.Instance.GetSPEC_SEC_OC();
myOC.LaunchView()

Ранее сегодня я изменил значение AllowMultiple=true, чтобы атрибут ManagesType можно было использовать более одного раза.У нас есть несколько сотен классов пользовательских коллекций.Большинство этих пользовательских коллекций имеют представление, наследуемое от CustomView, предназначенное для создания представления пользовательского интерфейса для определенного типа пользовательской коллекции и представления его пользователю.Атрибут ManagesType используется посредством отражения для создания словаря КАЖДОГО представления в нашем приложении, который наследуется от CustomView, чтобы «регистрировать», для обработки какого типа объекта он предназначен.LibSpecSelectionView «нарушил этот шаблон», отображая две разные коллекции одновременно (создает две вкладки и показывает одну пользовательскую коллекцию на одной вкладке, а другую — на второй вкладке). Таким образом, одно и то же представление способно обрабатывать две разные пользовательские коллекции.Словарь, в котором представления способны обрабатывать типы коллекций, затем используется с помощью метода расширения, чтобы позволить любой из наших пользовательских коллекций запускать зарегистрированное представление (или представление по умолчанию, если «зарегистрированное» представление не существует) через одну строку. позвоните менеджеру просмотра.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top