gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 03:01:02 25 4
gpt4 key购买 nike

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

我已成功访问所有私有(private)字段(继承的字段除外),以及所有公共(public)和 protected 继承字段。但是,我无法访问私有(private)的、继承的字段。以下示例说明:

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.

有没有可能做到这一点?显而易见的解决方案是将私有(private)的、继承的字段转换为 protected 字段。但是,目前我无法控制。

最佳答案

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

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

关于C#:通过反射访问继承的私有(private)实例成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/686482/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com