2008-10-28 14 views
22

Şu an sahip olduğum şey şudur:Bir sınıfa ait tüm özelliklerini ve temel sınıflarını (hiyerarşiye kadar) Yansıma ile nasıl edinirsiniz? (C#)

PropertyInfo[] info = obj.GetType().GetProperties(BindingFlags.Public); 

burada obj bir nesnedir.

Sorun, obj.GetType()'de bulunmayan özelliklerin bazıları, daha ilerideki temel sınıflardan birinde yer alıyor. Hata ayıklayıcısını durdurup obj'e bakarsam, almak istediğim özellikleri görmek için birkaç "temel" girdiyi kazmalıyım. Onları döndürmesi için ayarlayabildiğim bir bağlayıcı bayrak var mı, yoksa Type.BaseType hiyerarşisini tekrar tekrar kazmak zorundayım ve hepsinde GetProperties yapıyor muyum?

cevap

21

bunu kullanın:

PropertyInfo[] info = obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance); 

DÜZENLEME: Doğru cevap Jay ait olduğunu Tabii. GetProperties() parametresi olmadan GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static)'a eşdeğerdir. BindingFlags.FlattenHierarchy burada hiçbir rol oynar.

+0

Bunu bir cevap olarak işaretliyorum çünkü Jay'in çalışmasına ve istediğimi almasına rağmen, bu neden işe yarayacağını açıklıyor. Sadece ne Statnce ne Static belirtilmemişse, her ikisi de, aslında ne geri döndüğü varsayılan olarak varsayılacaktır. – Davy8

+0

Baktığım nesnede en üst düzey özellikler yoktu, bu yüzden, hiçbir şey döndürmediği zaman en üst düzeydekileri almaya çalıştığını varsaydım. Statik veya Örnek. – Davy8

4

Type.BaseType'a erişirseniz, temel türü alabilirsiniz. Her bir taban türüne yinelemeli olarak erişebilir ve türünüz System.Object olduğunda aşağıya geldiğinizde bunu bileceksiniz.

Type type = obj.GetType(); 
PropertyInfo[] info = type.GetProperties(BindingFlags.Public); 
PropertyInfo[] baseProps = type.BaseType.GetProperties(BindingFlags.Public); 
+2

seni seviyorum adamım. İyi bir. İnsanlar neden bu kadar oy kullandı? – argatxa

+0

Serin! Bunun için teşekkürler. Baz sınıftaki statik üye için günü kaydedildi. – Justjyde

12

Bu kadar karmaşık olduğunu sanmıyorum.

Eğer GetProperties için BindingFlags parametresini çıkarırsanız, ben aradığınız sonuca ulaşıncaya düşünüyorum:

TypeDescriptor.GetProperties(obj); 
2

Kullanım üretir Nicolas ile aynı fikirde olma eğilimi; Yansımaya ihtiyacınız olduğunu bilmediğiniz sürece, ComponentModel geçerli bir alternatiftir ve çalışma zamanı modelleri için bile doğru meta verileri alacağınız avantajı (örneğin, DataView/DataRowView). Örneğin

:

foreach (PropertyDescriptor prop in TypeDescriptor.GetProperties(obj)) 
    { 
     Console.WriteLine("{0}={1}", prop.Name, prop.GetValue(obj)); 
    } 
bir kenara olarak

, ayrıca bu konuda bazı basit performance tricks yapabilirsiniz; aynısını yansıma ve Delegate.CreateDelegate ile de yapabilirsiniz, ancak'un TypeDescriptionProvider ile tersine mantığı gizlemek için merkezi bir yer yoktur (bunlar aşina değilse endişelenmeyin; kodu "olduğu gibi kullanabilirsiniz";).

3

I:

class B 
    { 
     public int MyProperty { get; set; } 
    } 

    class C : B 
    { 
     public string MyProperty2 { get; set; } 
    } 

    static void Main(string[] args) 
    { 
     PropertyInfo[] info = new C().GetType().GetProperties(); 
     foreach (var pi in info) 
     { 
      Console.WriteLine(pi.Name); 
     } 
    } 

 
    MyProperty2 
    MyProperty 
İlgili konular