Apakah mungkin untuk membuat atribut yang dapat diinisialisasi dengan sejumlah variabel argumen?
Sebagai contoh:
[MyCustomAttribute(new int[3,4,5])] // this doesn't work
public MyClass ...
c#
attributes
Crono
sumber
sumber
Jawaban:
Atribut akan mengambil array. Meskipun jika Anda mengontrol atribut, Anda juga dapat menggunakan
params
(yang lebih baik bagi konsumen, IMO):Sintaks Anda untuk pembuatan array kebetulan tidak aktif:
sumber
Anda dapat melakukannya, tetapi tidak sesuai dengan CLS:
Acara:
Untuk penggunaan refleksi biasa, mungkin lebih disukai memiliki beberapa atribut, yaitu
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).sumber
Coba deklarasikan konstruktor seperti ini:
Kemudian Anda bisa menggunakannya seperti:
[MyCustomAttribute(3, 4, 5)]
sumber
Seharusnya tidak masalah. Dari spesifikasi, bagian 17.2:
Ekspresi E adalah atribut-argumen-ekspresi jika semua pernyataan berikut ini benar:
Berikut contohnya:
sumber
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;
sumber
Kamu bisa melakukannya. Contoh lain bisa jadi:
sumber
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.
sumber