C#Reflection - 从一个简单的类中获取字段值

时间:2011-10-04 14:16:52

标签: c# reflection

我有一个班级:

class A {
    public string a = "A-val" , b = "B-val";
}

我想通过反射打印对象成员

//Object here is necessary.
Object data = new A();
FieldInfo[] fields = data.GetType().GetFields();
String str = "";
foreach(FieldInfo f in fields){
    str += f.Name + " = " + f.GetValue(data) + "\r\n";
}

这是期望的结果:

a = A-val
b = B-val

不幸的是,这不起作用。请帮助,谢谢。

3 个答案:

答案 0 :(得分:60)

一旦修复以消除错误(缺少分号和错误的变量名称),您发布的代码工作 - 我刚试过它并且它显示了名称和值没有问题。

我的猜测是,实际上,你正在尝试使用非公开的字段。这段代码:

FieldInfo[] fields = data.GetType().GetFields();

...只会获得公共字段。您通常需要指定您还需要非公共字段:

FieldInfo[] fields = data.GetType().GetFields(BindingFlags.Public | 
                                              BindingFlags.NonPublic | 
                                              BindingFlags.Instance);

(我希望你真的毕竟没有公共领域......)

答案 1 :(得分:3)

请记住写下以下字段:

public string VarName{ get; set;}

然后实际上你有这个代码(这是反射看到的):

private string _varName;
public string get_VarName(){
....
}
public void set_VarName(strig value){
....
}

答案 2 :(得分:1)

正如@Stanislav所说,你必须记住编译器为属性生成的支持字段。如果要排除这些字段,可以使用以下代码:

FieldInfo[] fields = data.GetType()
    .GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
    .Where(f => f.GetCustomAttribute<CompilerGeneratedAttribute>() == null)
    .ToArray();