Çalışma zamanında öznitelik eklemek veya çalışma zamanında özniteliğin değerini değiştirmek mümkün müdür?
Çalışma zamanında öznitelik eklemek veya çalışma zamanında özniteliğin değerini değiştirmek mümkün müdür?
Yanıtlar:
Öznitelikler statik meta verilerdir. Montajlar, modüller, türler, üyeler, parametreler ve dönüş değerleri C # 'da birinci sınıf nesneler değildir (örneğin, System.Type
sınıf yalnızca bir türün yansıtılmış bir temsilidir). Bir tür için özniteliğin bir örneğini alabilir ve yazılabilirlerse özellikleri değiştirebilir, ancak bu, türe uygulandıkça özniteliği etkilemez.
Bu gerçekten tam olarak neyi başarmaya çalıştığınıza bağlıdır.
System.ComponentModel.TypeDescriptor şeyler türleri, özellikleri ve nesne örneklerine özelliklerini eklemek için kullanılır, ve bunu yanı sıra bu özellikleri almak için kullanmak zorunda olduğu sınırlaması vardır edilebilir. Bu nitelikleri tüketen kodu yazıyorsanız ve bu sınırlamalar dahilinde yaşayabiliyorsanız, kesinlikle öneririm.
Bildiğim kadarıyla, PropertyGrid denetimi ve visual studio tasarım yüzeyi BCL'de TypeDescriptor öğelerini tüketen tek şey. Aslında, gerçekten yapmaları gereken şeylerin yaklaşık yarısını böyle yapıyorlar.
TypeDescriptor
ve TypeDescriptionProvider
uygulanmadı?)
[Attr(1), Attr(2), Attr(3)]
Sadece ex Attr(3)
bulunur.
Sadece farklı olmak için, Reflection kullanarak referans veren bir makale buldum.
İşte bağlantı: http://www.codeproject.com/KB/cs/dotnetattributes.aspx , olası yaklaşımlar tartışıldığı için makalenin altındaki yorumlardan bazılarına da bakmak isteyeceksiniz.
YourClass
girebilirsiniz YourRuntimeClassWithAttributes
.
YourClass
isterseniz, çalışma zamanında alt sınıfa sınıflandırabilir ve istenen dinamik olarak oluşturulmuş niteliklere sahip olan biraz farklı bir adla özdeş bir sınıf oluşturabilirsiniz ve polimorfizm, tip kontrol kodunun hala tanımlanmasına izin verir .
Hayır değil.
Öznitelikler meta verilerdir ve derlenmiş derlemede ikili biçimde depolanır (bu nedenle bunlarda yalnızca basit türleri kullanabilirsiniz).
Ben inanmıyorum. Yanlış olsam bile, umabileceğiniz en iyi şey onları asla bir Type örneğine eklemektir .
Dinamik olarak eklenebilmek için bir şeye ihtiyacınız varsa, c # öznitelikleri böyle değildir. Verileri xml'de depolamaya bakın. Son zamanlarda w / öznitelikleri başladı, ancak sonunda w / xml serileştirme taşındı bir proje yaptım.
Neden ihtiyacın var? Nitelikler yansıma için ek bilgi verir, ancak dışarıdan istediğiniz özellikleri biliyorsanız, bunlara ihtiyacınız yoktur.
Meta verileri harici olarak nispeten kolay bir şekilde bir veritabanında veya kaynak dosyasında depolayabilirsiniz.
System.ComponentModel.TypeDescriptor ile çok zor denedim. Bu işe yaramaz anlamına gelmez ama bunun için kod görmek istiyorum.
Karşı bölümde, bazı Öznitelik değerlerini değiştirmek istedim. Bu amaçla iyi çalışan 2 işlev yaptım.
// ************************************************************************
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);
}
}
}
Java'da bir harita kullanarak ve kendi Anahtar-Değer kodlamamı uygulayarak bu sorunu giderdim.
http://developer.apple.com/documentation/Cocoa/Conceptual/KeyValueCoding/KeyValueCoding.html
TypeDescriptor
- sadece değilPropertyGrid
.