Можно ли создать атрибут, который можно инициализировать с переменным количеством аргументов?
Например:
[MyCustomAttribute(new int[3,4,5])] // this doesn't work
public MyClass ...
c#
attributes
Crono
источник
источник
Ответы:
Атрибуты примут массив. Хотя, если вы контролируете атрибут, вы также можете использовать
params
вместо него (что лучше для потребителей, IMO):Ваш синтаксис для создания массива просто отключен:
источник
Вы можете это сделать, но это не соответствует требованиям CLS:
Показывает:
Для регулярного использования отражения может быть предпочтительнее иметь несколько атрибутов, т.е.
Однако это не будет работать с
TypeDescriptor
/PropertyDescriptor
, где поддерживается только один экземпляр любого атрибута (выигрывает первый или последний, я не могу вспомнить какой).источник
Попробуйте объявить конструктор следующим образом:
Тогда вы можете использовать это как:
[MyCustomAttribute(3, 4, 5)]
источник
Это должно быть нормально. Из спецификации, раздел 17.2:
Выражение E является выражением- атрибут-аргумент, если все следующие утверждения верны:
Вот пример:
источник
Да, но вам нужно инициализировать массив, который вы передаете. Вот пример теста строки в наших модульных тестах, который проверяет переменное количество параметров командной строки;
источник
Вы можете сделать это. Другой пример:
источник
Чтобы воспользоваться ответом Марка Гравелла, да, вы можете определить атрибут с параметрами массива, но применение атрибута с параметром массива несовместимо с CLS. Однако просто определение атрибута с помощью свойства массива полностью соответствует требованиям CLS.
Я понял, что это Json.NET, библиотека, совместимая с CLS, имеет класс атрибутов JsonPropertyAttribute со свойством с именем ItemConverterParameters, которое представляет собой массив объектов.
источник