Apakah mungkin menambahkan atribut saat runtime atau mengubah nilai atribut saat runtime?
sumber
Apakah mungkin menambahkan atribut saat runtime atau mengubah nilai atribut saat runtime?
Atribut adalah metadata statis. Rakitan, modul, tipe, anggota, parameter, dan nilai pengembalian bukan objek kelas satu di C # (misalnya, System.Type
kelas hanyalah representasi yang tercermin dari suatu jenis). Anda bisa mendapatkan instance atribut untuk tipe dan mengubah properti jika itu dapat ditulisi tetapi itu tidak akan mempengaruhi atribut seperti yang diterapkan pada tipe.
Ini sangat tergantung pada apa yang sebenarnya ingin Anda capai.
Hal- hal System.ComponentModel.TypeDescriptor dapat digunakan untuk menambahkan atribut ke tipe, properti, dan instance objek, dan memiliki batasan bahwa Anda harus menggunakannya untuk mengambil properti tersebut juga. Jika Anda menulis kode yang menggunakan atribut tersebut, dan Anda dapat hidup dalam batasan itu, maka saya pasti akan menyarankannya.
Sejauh yang saya tahu, kontrol PropertyGrid dan permukaan desain studio visual adalah satu-satunya hal di BCL yang mengkonsumsi barang-barang TypeDescriptor. Bahkan, itulah cara mereka melakukan setengah dari hal-hal yang benar-benar perlu mereka lakukan.
TypeDescriptor
- bukan hanyaPropertyGrid
.TypeDescriptor
danTypeDescriptionProvider
tidak diimplementasikan?[Attr(1), Attr(2), Attr(3)]
hanyaAttr(3)
ditemukan.Kamu tidak bisa Salah satu solusi mungkin untuk menghasilkan kelas turunan saat runtime dan menambahkan atribut, meskipun ini mungkin sedikit berlebihan.
sumber
Nah, untuk menjadi berbeda, saya menemukan artikel yang referensi menggunakan Reflection.Emit untuk melakukannya.
Berikut tautannya: http://www.codeproject.com/KB/cs/dotnetattributes.aspx , Anda juga ingin melihat beberapa komentar di bagian bawah artikel, karena pendekatan yang mungkin dibahas.
sumber
YourClass
menjadi subkelasYourRuntimeClassWithAttributes
.YourClass
, Anda dapat mensubklasifikasikannya pada saat runtime dan menghasilkan kelas yang identik dengan nama yang sedikit berbeda yang juga memiliki atribut yang dibuat secara dinamis yang diinginkan, dan polimorfisme akan memungkinkan jenis kode pengecekan untuk tetap mengidentifikasi baseclass Anda.Tidak, tidak.
Atribut adalah meta-data dan disimpan dalam bentuk biner di rakitan yang dikompilasi (itu juga sebabnya Anda hanya dapat menggunakan tipe sederhana di dalamnya).
sumber
Saya tidak percaya begitu. Bahkan jika saya salah, hal terbaik yang dapat Anda harapkan adalah menambahkannya ke seluruh Tipe, tidak pernah menjadi instance dari Tipe.
sumber
Jika Anda membutuhkan sesuatu untuk dapat ditambahkan secara dinamis, atribut c # bukanlah caranya. Lihatlah ke dalam menyimpan data dalam xml. Saya baru-baru ini melakukan proyek yang saya mulai w / atribut, tetapi akhirnya pindah ke serialisasi w / xml.
sumber
Mengapa Anda harus melakukannya? Atribut memberikan informasi tambahan untuk refleksi, tetapi jika Anda secara eksternal tahu properti mana yang Anda inginkan, Anda tidak membutuhkannya.
Anda bisa menyimpan data meta secara eksternal relatif mudah dalam database atau file sumber daya.
sumber
Saya berusaha sangat keras dengan System.ComponentModel.TypeDescriptor tanpa hasil. Itu tidak berarti itu tidak bisa berfungsi tetapi saya ingin melihat kode untuk itu.
Di bagian balasan, saya ingin mengubah beberapa nilai atribut. Saya melakukan 2 fungsi yang berfungsi dengan baik untuk tujuan itu.
sumber
Di Jawa saya biasa mengatasi hal ini dengan menggunakan peta dan menerapkan saya sendiri mengambil Key-Value coding.
http://developer.apple.com/documentation/Cocoa/Conceptual/KeyValueCoding/KeyValueCoding.html
sumber