Type.GetFields为公共字段返回一个空的System.Reflection.FieldInfo数组

时间:2012-05-07 16:44:23

标签: c# reflection

我有一个类只包含许多标准类型的公共字段。 调用myObject.GetType().GetFields()返回一个空数组。

问题是什么?

更新: 我很抱歉,问题是我使用的是WCF服务公开的类。原始类(比如说A)和暴露(WcfReference.A)是不同的类。 A的成员成为WcfReference.A中的私有字段,并作为属性公开。

也许应该删除这个问题。

2 个答案:

答案 0 :(得分:5)

不带参数的GetFields()将返回您的类型的公共字段(不是@Kenneth Ito注意到的属性)。

例如

public class Test {
   public string var_;//I'm a public field, I'll be returned
   private int id_; //I'm a private field, you'll have to do more to get me
   public int Id {get { return id_;} set {id_=value;}} //I'm a property, I don't feel concerned
}

如果你这样做

var test = new Test();
test.GetType().GetFields();

将返回一个包含一个项目的数组:var _

答案 1 :(得分:0)

在早期版本的.NET中(我为1.1项目添加功能,可惜我),默认方法GetFields()将返回一个空数组。 1.1之后,他们更新了此方法以包含所有公共属性。我不知道为什么他们做了这个改变,因为已经有一个GetProperties()方法可以做同样的事情。

此方法是获取私有字段的方法,因此了解如何使用它是至关重要的。方法GetFields(BindingFlags flags)存在重载。它使用BindingFlags的组合来确定您希望从对象中获取哪些字段。

因此,如果您想要实例私有字段,请调用:

GetFields(BindingFlags.Instance | BindingFlags.NonPublic);

如果您只想要公共静态属性,请调用:

GetFields(BindingFlags.Static | BindingFlags.Public);

您还可以继续将它们组合到所有静态字段中:

GetFields(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);

还有许多其他类型的BindingFlags,因此请查看上面链接的MSDN页面,了解您可能需要的其他任何内容。