AFAIK, i parametri denominati consentono solo tipi interi. Sfortunatamente non ho un riferimento a questo, l'ho solo imparato attraverso la mia stessa sperimentazione.
Quando si tenta di utilizzare inizializzatori oggetto, ho ottenuto questo errore dal compilatore:
Un argomento attributo deve essere un'espressione costante, typeof espressione o creazione matrice espressione di un tipo di parametro di attributo
Anche se questo documentation è vecchia di qualche anno, ha le informazioni di riferimento che cercavo:
attributo p arametri sono limitati a valori costanti dei seguenti tipi:
- tipi semplici (bool, byte, char, short, int, long, float, e doppie)
- stringa
- System.Type
- enums
- oggetto (l'argomento di un parametro di attributo di tipo oggetto deve essere un valore costante di uno dei tipi precedenti.) Monodimensionali array di qualsiasi tipo di cui sopra
Così funziona:
//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
considerando che il presente non lo farei:
//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: solo per elaborare, gli attributi fanno parte dei metadati per i costrutti a cui sono applicati (all'interno dell'IL generato), quindi i membri della classe attribute devono essere determinati al momento della compilazione; da qui la restrizione sui parametri degli attributi ai valori costanti.
fonte
2012-01-18 22:02:33
Una volta ho messo un inizializzatore 'stringa []' in un attributo. – JohnL