C#:使用System.Reflection.GetFields()显示字段元数据

时间:2012-04-27 12:19:34

标签: c# system.reflection

  

可能重复:
  Find a private field with Reflection?

我正在尝试使用System.Reflection.GetFields()方法显示类的字段名称。

问题是它只在字段声明为“public”时才有效。 例如:

class Element
{
    private String id;
    private string a;
    private string b;
    private int c;
    private Dictionary<String, String> dict;

    public Element(String id)
    {
        this.id= id;
    }}

当我尝试调用System.Reflection.GetFields()方法时,它不起作用(它返回一个空数组)。但是,如果我将字段的可见性更改为“public”,则可以正常工作..

任何人都知道如何在不公开的情况下让它工作?

由于

3 个答案:

答案 0 :(得分:3)

试试这个:

GetFields(BindingFlags.NonPublic | BindingFlags.Instance)

更新: 以下是在没有参数的情况下调用GetFields时场景下的内容:

public FieldInfo[] GetFields()
{
   return this.GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance);
}

因此,正如您所看到的,默认情况下不会返回私有字段。

这里是来自msdn的GetFields()方法的描述:

  

返回当前Type的所有公共字段。返回值:一个数组   FieldInfo对象表示为其定义的所有公共字段   当前类型。 - 或 - 如果没有公共字段,则为FieldInfo类型的空数组   是为当前类型定义的。

答案 1 :(得分:2)

试试这个

var fieldinfo = typeof(Element).GetField("field name", BindingFlags.NonPublic |
                             BindingFlags.Instance);

答案 2 :(得分:1)

GetFields方法仅返回 public 字段。 如果您希望它返回私有和公共字段,请使用:

c.GetType().GetFields(BindingFlags.Instance|BindingFlags.NonPublic|BindingFlags.Public);

您必须指定 BindingFlags.Instance BindingFlags.Static 以及BindingFlags.Public或BindingFlags.NonPublic,否则将不会返回任何成员。

查看msdn了解更多信息: MSDN