Saya memiliki tipe,, t
dan saya ingin mendapatkan daftar properti publik yang memiliki atribut MyAttribute
. Atribut ditandai dengan AllowMultiple = false
, seperti ini:
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
Saat ini yang saya miliki adalah ini, tetapi saya berpikir ada cara yang lebih baik:
foreach (PropertyInfo prop in t.GetProperties())
{
object[] attributes = prop.GetCustomAttributes(typeof(MyAttribute), true);
if (attributes.Length == 1)
{
//Property with my custom attribute
}
}
Bagaimana saya bisa meningkatkan ini? Saya minta maaf jika ini adalah duplikat, ada satu ton utas refleksi di luar sana ... sepertinya itu topik yang cukup panas.
c#
.net
reflection
wsanville
sumber
sumber
Jawaban:
Ini menghindari keharusan mematerialisasikan instance atribut apa pun (yaitu lebih murah dari
GetCustomAttribute[s]()
.sumber
get
tidak dipanggil bahkan saat menggunakanGetCustomAttributes
; Namun, atribut tersebut dipakai , yang tidak gratis. Jika Anda tidak perlu memeriksa nilai atribut tertentu,IsDefined
lebih murah. Dan pada 4.5, ada cara untuk memeriksa data instantiasi tanpa benar - benar membuat instances atribut apa pun (walaupun ini dimaksudkan hanya untuk skenario yang sangat spesifik)Solusi yang saya gunakan paling banyak didasarkan pada jawaban Tomas Petricek. Saya biasanya ingin melakukan sesuatu dengan baik atribut dan properti.
sumber
Sejauh yang saya tahu, tidak ada cara yang lebih baik dalam hal bekerja dengan perpustakaan Reflection dengan cara yang lebih cerdas. Namun, Anda bisa menggunakan LINQ untuk membuat kode sedikit lebih baik:
Saya percaya ini membantu Anda menyusun kode dengan cara yang lebih mudah dibaca.
sumber
Selalu ada LINQ:
sumber
Jika Anda berurusan secara teratur dengan Atribut dalam Refleksi, sangat, sangat praktis untuk mendefinisikan beberapa metode ekstensi. Anda akan melihat bahwa dalam banyak proyek di luar sana. Yang ini adalah yang sering saya miliki:
yang dapat Anda gunakan suka
typeof(Foo).HasAttribute<BarAttribute>();
Proyek-proyek lain (misalnya StructureMap) memiliki kelas ReflectionHelper lengkap yang menggunakan pohon Expression untuk memiliki sintaksis yang baik untuk identitas misalnya PropertyInfos. Penggunaan kemudian terlihat seperti itu:
sumber
Selain jawaban sebelumnya: lebih baik menggunakan metode
Any()
daripada memeriksa panjang koleksi:Contoh di dotnetfiddle: https://dotnetfiddle.net/96mKep
sumber
.Any()
tidak memeriksa panjangnya. Tetapi jawaban saya bukan tentang properti yang ditemukan dengan tepat satu atribut. Kedua, saya tidak yakin Anda membaca kode dengan benar -.Any
metode memanggil hasil dariGetCustomAttrubutes
metode tersebut. Jadi tipe daripropertiesWithMyAttribute
koleksi properti. Lihatlah contohnya di dotnetfiddle (saya menambahkan tautan ke jawabannya).