Jawaban:
Atribut akan mengambil array. Meskipun jika Anda mengontrol atribut, Anda juga dapat menggunakan params
(yang lebih baik bagi konsumen, IMO):
class MyCustomAttribute : Attribute {
public int[] Values { get; set; }
public MyCustomAttribute(params int[] values) {
this.Values = values;
}
}
[MyCustomAttribute(3, 4, 5)]
class MyClass { }
Sintaks Anda untuk pembuatan array kebetulan tidak aktif:
class MyCustomAttribute : Attribute {
public int[] Values { get; set; }
public MyCustomAttribute(int[] values) {
this.Values = values;
}
}
[MyCustomAttribute(new int[] { 3, 4, 5 })]
class MyClass { }
Anda dapat melakukannya, tetapi tidak sesuai dengan CLS:
[assembly: CLSCompliant(true)]
class Foo : Attribute
{
public Foo(string[] vals) { }
}
[Foo(new string[] {"abc","def"})]
static void Bar() {}
Acara:
Warning 1 Arrays as attribute arguments is not CLS-compliant
Untuk penggunaan refleksi biasa, mungkin lebih disukai memiliki beberapa atribut, yaitu
[Foo("abc"), Foo("def")]
Namun, ini tidak akan berfungsi dengan TypeDescriptor
/ PropertyDescriptor
, di mana hanya satu contoh atribut apa pun yang didukung (baik kemenangan pertama atau terakhir, saya tidak ingat yang mana).
Coba deklarasikan konstruktor seperti ini:
public class MyCustomAttribute : Attribute
{
public MyCustomAttribute(params int[] t)
{
}
}
Kemudian Anda bisa menggunakannya seperti:
[MyCustomAttribute(3, 4, 5)]
Seharusnya tidak masalah. Dari spesifikasi, bagian 17.2:
Ekspresi E adalah atribut-argumen-ekspresi jika semua pernyataan berikut ini benar:
Berikut contohnya:
using System;
[AttributeUsage(AttributeTargets.All, AllowMultiple = false, Inherited = true)]
public class SampleAttribute : Attribute
{
public SampleAttribute(int[] foo)
{
}
}
[Sample(new int[]{1, 3, 5})]
class Test
{
}
Ya, tetapi Anda perlu menginisialisasi larik yang Anda masukkan. Berikut adalah contoh dari pengujian baris dalam pengujian unit kami yang menguji sejumlah variabel opsi baris perintah;
[Row( new[] { "-l", "/port:13102", "-lfsw" } )]
public void MyTest( string[] args ) { //... }
Untuk mendukung jawaban Marc Gravell, ya Anda dapat menentukan atribut dengan parameter array tetapi menerapkan atribut dengan parameter array tidak sesuai dengan CLS. Namun, hanya mendefinisikan atribut dengan properti array sudah sesuai dengan CLS.
Apa yang membuat saya menyadari ini adalah bahwa Json.NET, pustaka yang sesuai dengan CLS, memiliki kelas atribut JsonPropertyAttribute dengan properti bernama ItemConverterParameters yang merupakan larik objek.