AFAIK, los parámetros nombrados solo permiten tipos integrales. Desafortunadamente no tengo una referencia para respaldar esto, solo lo aprendí a través de mi propia experimentación.
Al intentar utilizar inicializadores de objetos, tengo este error del compilador:
Un argumento atributo debe ser una expresión constante, typeof expresión o la creación de la matriz expresión de un tipo de parámetro atributo
Aunque este documentation es un par de años de edad, tiene la información de referencia que estaba buscando:
Atributo p arámetros están restringidas a valores constantes de los siguientes tipos:
- tipos simples (bool, byte, char, short, int, long, float, y dobles)
- cadena
- System.Type
- enums
- objeto (El argumento para un parámetro de atributo de tipo objeto debe ser un valor constante de uno de los tipos anteriores.) Unidimensionales matrices de cualquiera de los tipos
anteriores Así funciona esto:
//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
Mientras que esto no haría:
//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: sólo para elaborar, los atributos forman parte de los metadatos para las construcciones a las que se aplican (dentro del IL generado), por lo tanto los miembros de la clase de atributo deben determinarse en tiempo de compilación; de ahí la restricción de los parámetros de atributos a valores constantes.
Una vez puse un inicializador 'string []' en un atributo. – JohnL