我是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();
}
}
未能找到字段B.a。
甚至可以实现这一目标吗?显而易见的解决方案是将私有的继承字段转换为受保护的字段。然而,这暂时不受我的控制。
答案 0 :(得分:14)
正如李所说,你可以用递归来做到这一点。
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);
}
答案 1 :(得分:4)
我没有尝试过,但您应该能够通过Type.BaseType属性访问基类型私有成员,并通过继承层次结构递归累积所有私有字段。
答案 2 :(得分:0)
您无法使用A
类型访问B
的私人字段,因为B
中不存在这些字段 - 它们仅存在于A
中。您需要直接指定A
的类型,或通过其他方式检索它(例如从B
类型获取基类。)
答案 3 :(得分:-1)
您可以使用“嵌套类”访问B类中的A类私有成员 。您将A类视为外类,将B类视为内类
Class A
{
...
Class B
{
.......
}
}