AFAIK, названные параметры допускают только интегральные типы. К сожалению, у меня нет ссылки на это, я только узнал об этом благодаря своим собственным экспериментам.
При попытке использовать объект инициализаторы, я получил эту ошибку от компилятора:
Аргумент атрибута должен быть константным выражением, TypeOf выражения выражения или создания массива ссылочного типа параметра атрибута
Хотя это documentation составляет несколько лет, он имеет справочную информацию, которую я искал:
Attribute р arameters ограничены постоянных значения следующих типов:
- Простых типы (BOOL, байты, символ, короткая, INT, длинная, с плавающей точкой и двойная)
- струнного
- System.Type
- enums
- объект (Аргумент параметра атрибута объекта типа должен быть постоянным значением одного из вышеуказанных типов.) Одномерные массивы любого из перечисленных выше типов
Так это работает:
//Test attribute class
[AttributeUsage(AttributeTargets.All)]
internal class TestAttribute : Attribute
{
public int[] Something { get; set; }
}
//Using an array initialiser - an array of integers
[TestAttribute(Something = new int[]{1, 2, 3, 4, 5})]
public abstract class Something
В то время как это не так:
//Test person class
internal class Person
{
public string Name { get; set; }
public Person(string name)
{
this.Name = name;
}
}
//Test attribute class
[AttributeUsage(AttributeTargets.All)]
internal class TestAttribute : Attribute
{
public IEnumerable<Person> Something { get; set; }
}
//This won't work as Person is not an integral type
[TestAttribute(Something = new Person[]{new Person("James")})]
EDIT: только для разработки, атрибуты составляют часть метаданных для конструкций, к которым они применяются (внутри сгенерированного ИЛ), поэтому члены класса атрибута должны быть определены во время компиляции; следовательно, ограничение по параметрам атрибута на постоянные значения.
Я как-то поместил инициализатор 'string []' в атрибут. – JohnL