2009-09-09 13 views
26

Aşağıdaki kodu göz önünde bulundurun.TypeDescriptor.GetProperties() vs Type.GetProperties()

Object obj; 
PropertyDescriptorCollection A = TypeDescriptor.GetProperties(obj); 
PropertyInfo[] B = obj.GetType().GetProperties(); // EDIT* 

ben TypeDescriptor.GetProperties anladığım A ve B arasındaki farkı anlamaya çalışıyorum() sadece edecek) özel TypeDescriptor özelliklerinin yanı Type.GetProperties (dönecektir Nesnenin intrinsik "gerçek" özelliklerini döndürür. Bu doğru mu? Eğer obj herhangi bir özel TypeDescriptor özelliğine sahip değilse, o zaman nesnenin gerçek içsel özelliklerini geri döndürme varsayılanıdır. . DÜZENLEME önce kod


* Orijinal ikinci hat (yanlış dönüş değerine sahip olmuştur):

PropertyDescriptorCollection B = obj.GetType() GetProperties(); Onlar tasarım zamanı çevre ile etkileşim böylece

cevap

18
obj.GetType().GetProperties() PropertyDescriptorCollection döndürülmez, bir System.Reflection.PropertyInfo[] döndürür. PropertyInfo sınıfı, önerdiğiniz gibi, yalnızca nesne üzerinde oluşturulan gerçek özellikleri temsil eder. PropertyDescriptor, PropertyDescriptor sınıfının (özel tanımlayıcıyı tanımlayan türle uygulanan) özel bir somut alt öğesidir ya da özelliğin dinamik olarak çağrılmasını sağlamak için PropertyInfo sınıfını kullanan mühürlü iç sınıfın ReflectPropertyDescriptor örneğidir.

Özel bir tanımlayıcı tanımlamayan bir sınıf için, PropertyDescriptorPropertyInfo'u atlıyor olsa da, işlevsel olarak aynı nesneleri geri alacaksınız.

9

TypeDescriptor sınıf, tasarımcılar kullanılır. Özellikle, tasarımcılar TypeDescriptor'un çeşitli özelliklerini geçersiz kılabilir ve genişletebilirler, ancak Type'u kullanamazlar.

Veriye bağlı denetimlerle iyi bir örnek çalışıyor. DataSource özelliği, System.Object tipindedir, ancak tasarım zamanında, bu özellik daha zengin bir tasarım zamanı UI'si olan yeni bir özellik ile değiştirilmiştir.

+0

Tasarımcılar için kullanılır, ancak veri bağlamada da kullanılır, bu yüzden sadece tasarım zamanı teknolojisidir. –

7

TypeDescriptor sınıfı, obj türündeki özellikleri ve nesnenin kendisine veya türüne katkıda bulunan diğer özellikleri temsil eden PropertyDescriptor nesnesini döndürür.

bileşen modeli aslında oldukça karmaşıktır, ama açıkladığınız gibi TypeDescriptor.GetProperties() temel uygulama tipik PropertyInfo nesnelere bir indirection temsil ReflectPropertyDescriptor örneklerini dönecektir. PropertyInfo nesneler gibi PropertyDescriptor nesnelerini kullanabilirsiniz: nesnenin değerini almak ve ayarlamak için kullanılabilir ve nitelikleri vardır.

WPF'de DependencyObject örnekleri için, TypeDescriptor.GetProperties() da ekli özellikleri döndürür. Bu PropertyDescriptor nesnesi, bu durumda yansımadan ziyade bağımlılık nesne modeline bir dolaylılık sağlar.Bileşen tasarımcısı olarak

, çalışma zamanında veya designtime de kendi PropertyDescriptor nesneler yaratmak için ICustomTypeDescriptor veya TypeDescriptionProviderAttribute (ve belki bazı diğer teknikleri) kullanmak mümkündür. Her durumda, Type.GetProperties()'dan döndürülen özelliklerin, içeriğe bağlı olarak TypeDescriptor'dan döndürülenlerden çok farklı olması mümkündür.

İlgili konular