Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#反射-从简单类获取字段值_C#_Reflection - Fatal编程技术网

C#反射-从简单类获取字段值

C#反射-从简单类获取字段值,c#,reflection,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 + " =

我有一门课:

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

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

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

我的猜测是,在现实中,您试图使用非公共字段。此代码:

FieldInfo[] fields = data.GetType().GetFields();
。。。将只获取公共字段。通常需要指定还需要非公共字段:

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

(我希望您毕竟没有真正的公共字段…

请记住,当您编写如下字段时:

public string VarName{ get; set;}
实际上,您有以下代码(这就是反射所看到的):


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

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

为什么进展不顺利?出了什么问题?您的代码(经过一些小的修改使其可编译)确实可以工作。。。到底是什么问题?我没有尝试编译它,但是f.GetValue(数据)没有返回对象吗?这应该是.ToString()以放入string@MartinBooth:
GetValue
返回一个对象,但你可以将一个对象添加到字符串中,这样就可以了(或多或少)字段是公共的,不是吗?@MartinBooth:是的,我在编辑-基本上,它在给定的代码中工作正常,但我怀疑当它不工作时,OP有私有字段。我不知道您必须显式指定
BindingFlags.Instance
——我认为这是默认值。但是,如果没有该标志,在我的例子中就不会返回任何字段。@Oliver:如果要指定任何标志,则需要指定它。默认设置类似于“public,instance,static”。@JonSkeet截至2015年8月18日,我得到的默认设置是:BindingFlags.public | BindingFlags.NonPublic | BindingFlags.instance | BindingFlags.static | BindingFlags.DeclaredOnly;不想对一篇旧文章吹毛求疵(3年前的文章上的线程necro),但是
公共字符串VarName{get;set;}
根本不是一个字段。这是一笔财产。具体地说,是一种自动属性,它在编写时会在编译时创建一个私有字段。但财产本身只是一种财产。我只是想澄清一下,如果有人碰巧发现了这一点,并感到困惑。
FieldInfo[] fields = data.GetType()
    .GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
    .Where(f => f.GetCustomAttribute<CompilerGeneratedAttribute>() == null)
    .ToArray();