AFAIK, именованные параметры допускают только целочисленные типы. К сожалению, у меня нет ссылки, подтверждающей это, я узнал об этом только своими экспериментами.
При попытке использовать инициализаторы объектов я получил эту ошибку от компилятора:
Аргументом атрибута должно быть константное выражение, выражение typeof или выражение создания массива типа параметра атрибута
Хотя этой документации уже несколько лет, в ней содержится справочная информация, которую я искал:
Параметры атрибута ограничены постоянными значениями
следующие типы:
- Простые типы (bool, byte, char, short, int, long, float и double)
- строка
- System.Type
- перечисления
- объект (Аргумент к параметру атрибута объекта типа должен быть постоянным значением одного из вышеуказанных типов.) Одномерный
массивы любого из вышеперечисленных типов
Так что это работает:
//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")})]
РЕДАКТИРОВАТЬ: просто для уточнения, атрибуты образуют часть метаданных для конструкций, к которым они применяются (в пределах сгенерированного IL), таким образом, члены класса атрибута должны быть определены во время компиляции; отсюда ограничение на параметры атрибута постоянными значениями.