Apakah mungkin menambahkan atribut saat runtime atau mengubah nilai atribut saat runtime?
Apakah mungkin menambahkan atribut saat runtime atau mengubah nilai atribut saat runtime?
Jawaban:
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
dan TypeDescriptionProvider
tidak diimplementasikan?
[Attr(1), Attr(2), Attr(3)]
hanya Attr(3)
ditemukan.
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.
YourClass
menjadi subkelas YourRuntimeClassWithAttributes
.
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).
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.
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.
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.
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.
// ************************************************************************
public static void SetObjectPropertyDescription(this Type typeOfObject, string propertyName, string description)
{
PropertyDescriptor pd = TypeDescriptor.GetProperties(typeOfObject)[propertyName];
var att = pd.Attributes[typeof(DescriptionAttribute)] as DescriptionAttribute;
if (att != null)
{
var fieldDescription = att.GetType().GetField("description", BindingFlags.NonPublic | BindingFlags.Instance);
if (fieldDescription != null)
{
fieldDescription.SetValue(att, description);
}
}
}
// ************************************************************************
public static void SetPropertyAttributReadOnly(this Type typeOfObject, string propertyName, bool isReadOnly)
{
PropertyDescriptor pd = TypeDescriptor.GetProperties(typeOfObject)[propertyName];
var att = pd.Attributes[typeof(ReadOnlyAttribute)] as ReadOnlyAttribute;
if (att != null)
{
var fieldDescription = att.GetType().GetField("isReadOnly", BindingFlags.NonPublic | BindingFlags.Instance);
if (fieldDescription != null)
{
fieldDescription.SetValue(att, isReadOnly);
}
}
}
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
TypeDescriptor
- bukan hanyaPropertyGrid
.