在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。
有没有可能做到这一点?显而易见的解决方案是将私有的、继承的字段转换为受保护的字段。然而,目前这不是我所能控制的。
发布于 2009-03-26 16:47:52
正如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);
}
发布于 2009-03-26 16:32:48
我还没有尝试过,但是您应该能够通过Type.BaseType属性访问基类型私有成员,并通过继承层次递归地累加所有私有字段。
发布于 2009-03-26 16:25:44
您不能使用B
类型访问A
的私有字段,因为这些字段在B
中不存在-它们只存在于A
中。您需要直接指定A
的类型,或者通过其他方法检索它(例如从B
的类型中获取基类)。
https://stackoverflow.com/questions/686482
复制相似问题