C#:通过reflection访问inheritance的私有实例成员

我是C#反思的绝对新手。 我想使用reflection来访问类中的所有私有字段,包括那些inheritance的字段。

我已成功访问除inheritance的所有私有字段,以及所有公共和受保护的inheritance字段。 但是,我无法访问私有的inheritance字段。 以下示例说明:

class A { private string a; public string c; protected string d; } class B : A { private string b; } class test { public static void Main(string[] Args) { B b = new B(); Type t; t = b.GetType(); FieldInfo[] fields = t.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); foreach(FieldInfo fi in fields){ Console.WriteLine(fi.Name); } Console.ReadLine(); } } 

这无法找到Ba字段

是否有可能实现这一目标? 显而易见的解决方案是将私有的inheritance字段转换为受保护的字段。 然而,目前这是我无法控制的。

正如李所说,你可以通过递归来做到这一点。

 private static void FindFields(ICollection 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(); FindFields(fields, typeof(B)); foreach (FieldInfo fi in fields) Console.WriteLine(fi.DeclaringType.Name + " - " + fi.Name); } 

我没有尝试过,但您应该能够通过Type.BaseType属性访问基类型私有成员,并通过inheritance层次结构递归累积所有私有字段。

您不能使用B类型访问A的私有字段,因为B不存在这些字段 – 它们仅存在于A 。 您需要直接指定A的类型,或通过其他方式检索它(例如从B类型获取基类)。

您可以使用“嵌套类”从B类访问A类的私有成员。 您将A类视为外类,将B类视为内类

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