Saya menggunakan atribut khusus yang diwarisi dari kelas atribut. Saya menggunakannya seperti ini:
[MyCustomAttribute("CONTROL")]
[MyCustomAttribute("ALT")]
[MyCustomAttribute("SHIFT")]
[MyCustomAttribute("D")]
public void setColor()
{
}
Tetapi kesalahan "Gandakan atribut 'MyCustomAttribute'" ditampilkan.
Bagaimana cara membuat atribut duplikat yang diperbolehkan?
c#
attributes
ebattulga.dll
sumber
sumber
AttributeUsageAttribute ;-p
Namun, perhatikan bahwa jika Anda menggunakan ComponentModel (
TypeDescriptor
), ini hanya mendukung satu contoh atribut (per jenis atribut) per anggota; refleksi mentah mendukung nomor apa pun ...sumber
Solusi anton benar, tapi ada gotcha lain .
Singkatnya, kecuali atribut khusus Anda menimpa TypeId, maka mengaksesnya
PropertyDescriptor.GetCustomAttributes()
hanya akan mengembalikan satu contoh atribut Anda.sumber
Secara default,
Attribute
s dibatasi untuk diterapkan hanya sekali ke satu bidang / properti / etc. Anda dapat melihat ini dari definisiAttribute
kelas di MSDN :Oleh karena itu, seperti yang telah dicatat orang lain, semua subclass dibatasi dengan cara yang sama, dan jika Anda memerlukan beberapa instance dari atribut yang sama, Anda perlu menyetel secara eksplisit
AllowMultiple
ketrue
:Pada atribut yang memungkinkan beberapa penggunaan, Anda juga harus mengganti
TypeId
properti untuk memastikan bahwa propertiPropertyDescriptor.Attributes
berfungsi seperti yang diharapkan. Cara termudah untuk melakukannya adalah dengan mengimplementasikan properti itu untuk mengembalikan instance atribut itu sendiri:(Memposting jawaban ini bukan karena yang lain salah, tetapi karena ini adalah jawaban yang lebih komprehensif / kanonik.)
sumber
Sebagai alternatif, pikirkan tentang mendesain ulang atribut Anda untuk memungkinkan suatu urutan.
atau
lalu parsing nilainya untuk mengonfigurasi atribut Anda.
Untuk contoh ini, lihat AuthorizeAttribute di kode sumber ASP.NET MVC di www.codeplex.com/aspnet .
sumber
MyCustomAttribute
konstruktor mengambil larik string, astring[]
, dengan atau tanpaparams
pengubah. Kemudian bisa diterapkan dengan sintaks[MyCustom("CONTROL", "ALT", "SHIFT", "D")]
(denganparams
).Setelah Anda menambahkan AttributeUsage, pastikan Anda menambahkan properti ini ke kelas Attribute Anda
sumber