2010-02-15 6 views
24

Mit Type.GetProperties() können Sie alle Eigenschaften Ihrer aktuellen Klasse und die public Eigenschaften der Basisklasse abrufen. Ist es irgendwie möglich, die private Eigenschaften der Basisklasse auch zu bekommen?Get private Eigenschaften/Methode der Basisklasse mit Reflexion

Dank

class Base 
{ 
    private string Foo { get; set; } 
} 

class Sub : Base 
{ 
    private string Bar { get; set; } 
} 


     Sub s = new Sub(); 
     PropertyInfo[] pinfos = s.GetType().GetProperties(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static); 
     foreach (PropertyInfo p in pinfos) 
     { 
      Console.WriteLine(p.Name); 
     } 
     Console.ReadKey(); 

Dies druckt nur "Bar", weil "Foo" in der Basisklasse und privat ist.

Antwort

41

Um alle Eigenschaften (public + private/protected/intern, statisch + Instanz) erhalten einen bestimmten Type someType (vielleicht GetType() mit someType zu bekommen):

PropertyInfo[] props = someType.BaseType.GetProperties(
     BindingFlags.NonPublic | BindingFlags.Public 
     | BindingFlags.Instance | BindingFlags.Static) 
+6

Darüber hinaus ist es möglich, durch die Basistypen (type = type.BaseType) zu durchlaufen, bis type.BaseType null ist, um ein vollständiges Bild zu erhalten. –

+3

Leider funktioniert dies nicht für private Eigenschaften der Basisklasse. nur für geerbte öffentliche und geschützte – Fabiano

+0

@ Fabiano - nicht öffentlich umfasst privat. –

2

Iterate durch die Typ Basis (type = Typ .BaseType), bis type.BaseType null ist.

MethodInfo mI = null; 
Type baseType = someObject.GetType(); 
while (mI == null) 
{ 
    mI = baseType.GetMethod("SomePrivateMethod", BindingFlags.NonPublic | BindingFlags.Instance); 
    baseType = baseType.BaseType; 
    if (baseType == null) break; 
} 
mI.Invoke(someObject, new object[] {}); 
Verwandte Themen