VB.NET使用Reflection遍历类成员时PropertyInfo计数为0的问题
问题分析与解决方案
嘿,我一眼就看出问题所在啦!你这里混淆了VB.NET里的字段(Field)和属性(Property),这就是myType.GetProperties()返回空数组的核心原因。
为什么会返回空?
在你的SomeClass定义里:
Public Class SomeClass Public Value1 As String Public Value2 As String Public Value3 As String Public Value4 As String End Class
这些Public XXX As String的定义是字段(Field),而非属性(Property)。而Type.GetProperties()方法的作用是检索类的属性成员,不会包含字段,所以自然返回计数为0的数组。
两种解决方法
方法1:获取字段而非属性
如果你就是要操作这些字段,把代码里的GetProperties()替换成GetFields()即可:
Public Function FindClassValue() As Boolean Dim someobj As New SomeClass Dim myType As Type = someobj.GetType ' 改用GetFields()获取字段 Dim fields As System.Reflection.FieldInfo() = myType.GetFields() For Each f As System.Reflection.FieldInfo In fields Debug.WriteLine(f.Name) Next Return True ' 原代码返回Nothing不符合Boolean类型,建议返回合理布尔值 End Function
方法2:将字段改为属性(更符合.NET规范)
如果你想让GetProperties()生效,把SomeClass里的字段定义改成属性(VB.NET支持简化的属性写法):
Public Class SomeClass Public Property Value1 As String Public Property Value2 As String Public Property Value3 As String Public Property Value4 As String End Class
这样再运行原来的GetProperties()代码,就能正常获取到这4个属性的PropertyInfo数组了。
小补充
如果需要获取非公共的成员(比如私有字段/属性),可以给GetFields()或GetProperties()传入绑定标记,例如:
' 获取所有公共实例字段 myType.GetFields(BindingFlags.Public Or BindingFlags.Instance)
内容的提问来源于stack exchange,提问作者Ashley Morgan
相关产品推荐
相关产品推荐

