You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:02:17