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 { ....... } }