VB.NET中能否从Test2构造函数获取Test类的属性名TestProperty1及其特性
结论
CLR运行时不会记录对象实例与承载它的类属性的绑定关系,因此无法直接在Test2的构造函数中自动获取它将要被赋值的Test类属性名,但可以通过以下两种常用方案实现需求:
方案1:使用调用方成员特性自动传递属性名
仅需修改Test2的构造函数,借助.NET内置的CallerMemberName特性,编译器会在编译阶段自动将构造调用处的成员名作为参数传入,无需修改原有构造调用代码:
- 先导入依赖命名空间:
Imports System.Runtime.CompilerServices
- 修改
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
相关产品推荐
相关产品推荐

