首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C#:通过反射访问继承的私有实例成员

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

Stack Overflow用户
提问于 2009-03-26 16:22:30
回答 4查看 13.8K关注 0票数 17

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

我已经成功地访问了除继承字段之外的所有私有字段,以及所有公共和受保护的继承字段。但是,我无法访问私有的、继承的字段。以下示例说明:

代码语言:javascript
复制
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();
    }
}

这无法找到字段B.a。

有没有可能做到这一点?显而易见的解决方案是将私有的、继承的字段转换为受保护的字段。然而,目前这不是我所能控制的。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-03-26 16:47:52

正如Lee所说,你可以用递归来做这件事。

代码语言:javascript
复制
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);
}
票数 14
EN

Stack Overflow用户

发布于 2009-03-26 16:32:48

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

票数 4
EN

Stack Overflow用户

发布于 2009-03-26 16:25:44

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/686482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档