Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.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# Type.GetFields为公共字段返回空的System.Reflection.FieldInfo数组_C#_Reflection - Fatal编程技术网

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

C# Type.GetFields为公共字段返回空的System.Reflection.FieldInfo数组,c#,reflection,C#,Reflection,我有一个类,它只包含一些相当标准类型的公共字段。 调用myObject.GetType().GetFields()返回一个空数组 有什么问题吗 更新: 对不起,各位,问题是我使用的是WCF服务公开的类。原始类(比如A)和公开类(wcfreeference.A)是不同的类。A的成员成为WcfReference.A中的私有字段,并作为属性公开 也许应该删除该问题。不带参数的GetFields()将返回您类型的公共字段(而不是@Kenneth Ito注意到的属性) 范例 public class Te

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

有什么问题吗

更新: 对不起,各位,问题是我使用的是WCF服务公开的类。原始类(比如A)和公开类(wcfreeference.A)是不同的类。A的成员成为WcfReference.A中的私有字段,并作为属性公开

也许应该删除该问题。

不带参数的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_

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\up>在.NET的旧版本中(我正在向1.1项目添加功能,很遗憾),默认方法
GetFields()
将返回一个空数组。1.1之后,他们更新了此方法,以包括所有公共属性。我不知道他们为什么要做这个更改,因为已经有一个
GetProperties()
方法可以做同样的事情

这种方法是获取私有字段的方法,因此了解如何使用它至关重要。该方法有一个重载。这将使用的组合来确定要从对象中选择哪些字段

因此,如果需要实例私有字段,可以调用:

GetFields(BindingFlags.Instance | BindingFlags.NonPublic);
GetFields(BindingFlags.Static | BindingFlags.Public);
如果只需要公共静态属性,可以调用:

GetFields(BindingFlags.Instance | BindingFlags.NonPublic);
GetFields(BindingFlags.Static | BindingFlags.Public);
您还可以继续为所有静态字段组合它们:

GetFields(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
还有许多其他类型的
BindingFlags
,因此请查看上面链接的MSDN页面,以了解您可能需要的任何其他类型。

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

这种方法是获取私有字段的方法,因此了解如何使用它至关重要。该方法有一个重载。这将使用的组合来确定要从对象中选择哪些字段

因此,如果需要实例私有字段,可以调用:

GetFields(BindingFlags.Instance | BindingFlags.NonPublic);
GetFields(BindingFlags.Static | BindingFlags.Public);
如果只需要公共静态属性,可以调用:

GetFields(BindingFlags.Instance | BindingFlags.NonPublic);
GetFields(BindingFlags.Static | BindingFlags.Public);
您还可以继续为所有静态字段组合它们:

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

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

“相当标准的类型”当然是一个通用的定义,但示例代码会更好;)你确定你的类型有字段而没有属性吗?将字段公开是一个非常糟糕的主意。也许你毕竟做对了。复制后代码。“相当标准的类型”当然是一个通用的定义,但示例代码会更好;)你确定你的类型有字段而没有属性吗?将字段公开是一个非常糟糕的主意。也许你毕竟做对了。我认为这是一个正确的答案。在某种程度上,它回答了这个问题。这只是.NET 1.1之后的真实情况,而且
GetFields()
有一个重载,我在下面概述了如何使用它只获取私有字段。我认为这最终是一个正确的答案。在某种程度上,它回答了这个问题。这只适用于post.NET 1.1,而且
GetFields()
有一个重载,我在下面概述了如何使用它来获取私有字段。