繁体   English   中英

C#:通过反射访问继承的私有实例成员

[英]C#: Accessing Inherited Private Instance Members Through Reflection

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

我成功访问了所有私有字段,不包括那些继承的字段,以及所有公共和受保护的继承字段。 但是,我无法访问私有的继承字段。 以下示例说明:

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字段

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

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

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);
}

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

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

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

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

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM