Saya punya kelas, sebut saja Buku dengan properti bernama Nama. Dengan properti itu, saya memiliki atribut yang terkait dengannya.
public class Book
{
[Author("AuthorName")]
public string Name
{
get; private set;
}
}
Dalam metode utama saya, saya menggunakan refleksi dan ingin mendapatkan pasangan nilai kunci dari setiap atribut untuk setiap properti. Jadi dalam contoh ini, saya berharap melihat "Penulis" untuk nama atribut dan "Nama Pengarang" untuk nilai atribut.
Pertanyaan: Bagaimana cara saya mendapatkan nama atribut dan nilai properti saya menggunakan Refleksi?
c#
reflection
propertyinfo
dikembangkan
sumber
sumber
Jawaban:
Gunakan
typeof(Book).GetProperties()
untuk mendapatkan berbagaiPropertyInfo
instance. Kemudian gunakanGetCustomAttributes()
pada masingPropertyInfo
- masing untuk melihat apakah ada di antara mereka yang memilikiAuthor
tipe atribut. Jika ya, Anda bisa mendapatkan nama properti dari info properti dan nilai atribut dari atribut tersebut.Sesuatu di sepanjang baris ini untuk memindai tipe properti yang memiliki tipe atribut spesifik dan untuk mengembalikan data dalam kamus (perhatikan bahwa ini dapat dibuat lebih dinamis dengan mengirimkan tipe ke rutin):
sumber
Untuk mendapatkan semua atribut properti dalam kamus, gunakan ini:
ingatlah untuk berubah dari
false
menjaditrue
jika Anda ingin menyertakan atribut yang diwarisi juga.sumber
Jika Anda hanya ingin satu nilai Atribut tertentu Misalnya Tampilan Atribut, Anda dapat menggunakan kode berikut:
sumber
Saya telah memecahkan masalah serupa dengan menulis Pembantu Atribut Properti Ekstensi Generik:
Pemakaian:
sumber
Fields
?Anda dapat menggunakan
GetCustomAttributesData()
danGetCustomAttributes()
:sumber
Jika Anda bermaksud "untuk atribut yang mengambil satu parameter, daftarkan nama-nama atribut dan nilai-parameter", maka ini lebih mudah di .NET 4.5 melalui
CustomAttributeData
API:sumber
sumber
Meskipun jawaban di atas yang paling dipilih pasti bekerja, saya sarankan menggunakan pendekatan yang sedikit berbeda dalam beberapa kasus.
Jika kelas Anda memiliki beberapa properti dengan atribut yang selalu sama dan Anda ingin agar atribut tersebut diurutkan ke dalam kamus, berikut caranya:
Ini masih menggunakan pemeran tetapi memastikan bahwa pemeran akan selalu bekerja karena Anda hanya akan mendapatkan atribut khusus dari jenis "Nama Pengarang". Jika Anda memiliki beberapa Atribut, jawaban di atas akan mendapatkan pengecualian.
sumber
Pemakaian:
atau:
sumber
Berikut adalah beberapa metode statis yang dapat Anda gunakan untuk mendapatkan MaxLength, atau atribut lainnya.
Menggunakan metode statis ...
Atau menggunakan metode ekstensi opsional pada contoh ...
Atau menggunakan metode statis penuh untuk atribut lain (StringLength misalnya) ...
Terinspirasi oleh jawaban Mikael Engver.
sumber
Necromancing.
Bagi mereka yang masih harus mempertahankan .NET 2.0, atau mereka yang ingin melakukannya tanpa LINQ:
Contoh penggunaan:
atau sederhana
sumber
Dalam contoh ini saya menggunakan DisplayName bukan Penulis karena memiliki bidang bernama 'DisplayName' untuk ditampilkan dengan nilai.
sumber
untuk mendapatkan atribut dari enum, saya menggunakan:
// Menggunakan
sumber
Hanya mencari tempat yang tepat untuk meletakkan kode ini.
katakanlah Anda memiliki properti berikut:
Dan Anda ingin mendapatkan nilai ShortName. Anda dapat melakukan:
Atau untuk membuatnya umum:
sumber