2009-03-26 18 views
17

C# yansımasında mutlak bir acemiyim. Miras kalanlar da dahil olmak üzere bir sınıftaki tüm özel alanlara erişmek için yansıma kullanmak istiyorum.C#: Inherited Private Örnek Üyelerin Yansıma Yoluyla Erişimi

Devralınan tüm özel alanların yanı sıra, genel ve korunan tüm devralınan alanlara erişimde başarılı oldum. Ancak, özel, devralınan alanlara erişemedim. Aşağıdaki örnek, aşağıdakileri göstermektedir: 0a).

Bunu yapmak bile mümkün mü? Açık olan çözüm, özel, devralınan alanları korunan alanlara dönüştürmektir. Ancak bu, şu an kontrolüm dışında.

cevap

14

Lee'nin belirttiği gibi, bunu özyinelemeyle yapabilirsiniz.

private static void FindFields(ICollection<FieldInfo> fields, Type t) { 
    var flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance; 

    foreach (var field in t.GetFields(flags)) { 
     // Ignore inherited fields. 
     if (field.DeclaringType == t) 
      fields.Add(field); 
    } 

    var baseType = t.BaseType; 
    if (baseType != null) 
     FindFields(fields, baseType); 
} 

public static void Main() { 
    var fields = new Collection<FieldInfo>(); 
    FindFields(fields, typeof(B)); 
    foreach (FieldInfo fi in fields) 
     Console.WriteLine(fi.DeclaringType.Name + " - " + fi.Name); 
} 
+0

Devralınan alanları yok saymak için "if" cümlesi yerine BindingFlags.DeclaredOnly değerini belirtebilirsiniz. – Timwi

+0

, bir Türünde BaseType kullanarak dışarı, hala Base sınıfının özel üyesine erişebilir. Hayır, bu benim için herhangi bir gerçek dünya problemini çözmüyor, ama sadece merak ediyorum, çünkü Type sınıfının BaseType özelliğini kullanıyorum (ki yazarken) Childs'ın temel sınıf üyelerine erişiyorum, yani dışarıda kullanmanın başka bir yolu var. Aynısını elde etmek için BaseType özelliği? – Zenwalker

0

B türünü kullanarak A özel alanlarına erişemezsiniz, çünkü bu alanlar B'da bulunmaz - bunlar yalnızca A'da bulunur. Ya doğrudan A türünü belirtmeniz veya diğer yollarla (temel sınıfı B türünden almak gibi) belirtmeniz gerekir.

+3

Çöp olarak Dış Sınıf ve Sınıf B olarak Sınıf A yapmak, tabi ki B'de var, bir yöntem A miras nasıl böyle özel saha çalışması erişen ? – Timwi

+4

B örneğinin A'nın özel üyeleri olabilir, ancak B Türünün bu tür üyelerle ilgili bilgisi yoktur. – Andy

4

Denemeyi denemedim, ancak Type.BaseType özelliği aracılığıyla taban tipi özel üyelerine erişebilmeli ve tüm özel alanları devralma hiyerarşisi aracılığıyla toplayabilmelisiniz.

-1

Sen ile Sınıf B Sınıf A özel üyeleri erişebilir 'İçiçe Sınıflar' . onlar B'de olmasaydı Sen İç Sınıf

Class A 
{ 
... 
Class B 
{ 
....... 
    } 

} 
+2

Sınıfları değiştiremiyorum. Sadece onlar hakkında bilgi toplamaya çalışıyorum. – Odrade