AFAIK, parametry o nazwach dopuszczają tylko typy całkowe. Niestety nie mam żadnego odniesienia, aby tego poprzeć, nauczyłem się tego tylko dzięki własnym eksperymentom.
Gdy próbuje użyć incjalizatory obiektów, mam ten błąd z kompilatora:
Argument atrybut musi być stałym wyrażeniem, typeof ekspresji lub tworzenia tablicy wyrażenia typu parametru atrybut
Chociaż documentation to kilka lat, że ma informacje referencyjne szukałem: p
Attribute arameters są ograniczone do stałych wartościach następujących typów:
- typów prostych (Bool, byte, char, short, int, long, float, i podwójne)
- smyczkowych
- System.Type
- wylicza obiekt
- (Argument parametru atrybutu obiektu typu musi być stałą wartością jednego z powyższych typów.) Jednowymiarowe tablice któregokolwiek z powyższych typów
Tak to działa:
//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
niniejsza nie będzie:
//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: właśnie opracowanie, atrybuty stanowią część metadanych dla konstruktów, do których są stosowane (w obrębie wygenerowanego IL), zatem członkowie klasy atrybutów muszą być określani w czasie kompilacji; stąd ograniczenie parametrów atrybutów do stałych wartości.
Raz wstawiłem inicjator 'string []' w atrybut. – JohnL