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

VB.NET中能否从Test2构造函数获取Test类的属性名TestProperty1及其特性

结论

CLR运行时不会记录对象实例与承载它的类属性的绑定关系,因此无法直接在Test2的构造函数中自动获取它将要被赋值的Test类属性名,但可以通过以下两种常用方案实现需求:


方案1:使用调用方成员特性自动传递属性名

仅需修改Test2的构造函数,借助.NET内置的CallerMemberName特性,编译器会在编译阶段自动将构造调用处的成员名作为参数传入,无需修改原有构造调用代码:

  1. 先导入依赖命名空间:
Imports System.Runtime.CompilerServices
  1. 修改Test2构造函数:
Class Test2
    Property Text As String
    ' 新增可选参数,标记CallerMemberName特性
    Sub New(ByVal SomeText As String, <CallerMemberName> Optional PropertyName As String = Nothing)
        Text = SomeText
        ' 此处PropertyName的值就是对应的属性名:TestProperty1 / TestProperty2
        Console.WriteLine(PropertyName)
    End Sub
End Class

注意:该方案仅适用于Test2实例直接在属性赋值语句中构造的场景,如果是先构造Test2实例再赋值给属性,拿到的会是构造调用处的成员名,而非目标属性名。


方案2:通过反射关联Test实例的属性与Test2实例

如果你已经持有Test类的实例,可以直接通过反射遍历属性,将Test2实例与所属属性名、关联的Description特性做绑定:

' 示例:遍历Test实例的所有Test2类型属性
Dim testObj As New Test()
Dim testType = GetType(Test)

' 筛选所有类型为Test2的属性
Dim test2Properties = testType.GetProperties().Where(Function(p) p.PropertyType = GetType(Test2))

For Each prop In test2Properties
    ' 获取属性名
    Dim propertyName = prop.Name
    ' 获取关联的Description特性值
    Dim desc = prop.GetCustomAttribute(Of Description)()?.Description
    ' 获取属性对应的Test2实例
    Dim test2Instance = CType(prop.GetValue(testObj), Test2)
    
    ' 此处已经拿到了三者的对应关系,可按需处理
Next

该方案不受Test2实例构造时机的限制,适用场景更广。


内容的提问来源于stack exchange,提问作者Andy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 14:36:03