使用反射从简单的类中获取字段值

问题描述 投票:0回答:3

我有课:

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

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

c# .net reflection
3个回答
79
投票
一旦修复以消除错误(缺少分号和错误的变量名称),您发布的代码

确实可以工作 - 我刚刚尝试过,它显示了名称和值,没有任何问题。

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

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

...只会获得

public字段。您通常需要指定您还需要非公共字段:

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

(我希望你不要

真的有公共领域,毕竟……)


3
投票
请记住,当您编写以下字段时:

public string VarName{ get; set;}

那么实际上你有这段代码(这就是反射看到的):

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

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

FieldInfo[] fields = data.GetType() .GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance) .Where(f => f.GetCustomAttribute<CompilerGeneratedAttribute>() == null) .ToArray();
    
© www.soinside.com 2019 - 2024. All rights reserved.