Відповіді:
Атрибути візьмуть масив. Хоча якщо ви керуєте атрибутом, ви також можете використовувати params
натомість (що приємніше для споживачів, IMO):
class MyCustomAttribute : Attribute {
public int[] Values { get; set; }
public MyCustomAttribute(params int[] values) {
this.Values = values;
}
}
[MyCustomAttribute(3, 4, 5)]
class MyClass { }
У вашому синтаксисі для створення масиву просто немає:
class MyCustomAttribute : Attribute {
public int[] Values { get; set; }
public MyCustomAttribute(int[] values) {
this.Values = values;
}
}
[MyCustomAttribute(new int[] { 3, 4, 5 })]
class MyClass { }
Ви можете це зробити, але це не сумісно з CLS:
[assembly: CLSCompliant(true)]
class Foo : Attribute
{
public Foo(string[] vals) { }
}
[Foo(new string[] {"abc","def"})]
static void Bar() {}
Показує:
Warning 1 Arrays as attribute arguments is not CLS-compliant
Для регулярного використання роздумів може бути кращим наявність декількох атрибутів, тобто
[Foo("abc"), Foo("def")]
Однак це не буде працювати з TypeDescriptor
/ PropertyDescriptor
, де підтримується лише один екземпляр будь-якого атрибута (перший чи останній виграш, я не можу згадати, який).
Спробуйте оголосити конструктор так:
public class MyCustomAttribute : Attribute
{
public MyCustomAttribute(params int[] t)
{
}
}
Тоді ви можете використовувати його так:
[MyCustomAttribute(3, 4, 5)]
Це повинно бути гаразд. З специфікації, розділ 17.2:
Вираз E є атрибут-аргумент вираз , якщо все з наступних тверджень вірно:
Ось приклад:
using System;
[AttributeUsage(AttributeTargets.All, AllowMultiple = false, Inherited = true)]
public class SampleAttribute : Attribute
{
public SampleAttribute(int[] foo)
{
}
}
[Sample(new int[]{1, 3, 5})]
class Test
{
}
Щоб повернути відповідь Марка Гравелла, так, ви можете визначити атрибут з параметрами масиву, але застосування атрибута з параметром масиву не відповідає CLS. Однак просто визначення атрибута з властивістю масиву ідеально сумісне з CLS.
Я зрозумів це: Json.NET, бібліотека, сумісна з CLS, має клас атрибутів JsonPropertyAttribute з властивістю під назвою ItemConverterParameters, що є масивом об'єктів.