如何从Person对象中提取IPersonName接口定义的属性?
问题根源
你遇到的情况是因为VB.NET默认的Option Strict Off允许后期绑定——虽然p2的编译时类型是IPersonName,但运行时它实际指向的是Person实例。当尝试访问p2.Age时,编译器不会报错(Option Strict Off下允许动态检查),运行时会检测实际对象的属性,所以能访问到Age。
解决方案
1. 开启Option Strict On(推荐)
这是最直接的类型安全方案,强制编译阶段就检查类型匹配,从根源上阻止对接口外属性的访问:
- 方法一:在项目属性的「编译」选项卡中,将
Option Strict设置为On; - 方法二:在代码文件顶部添加声明:
Option Strict On
开启后,再尝试访问p2.Age会直接在编译时报错,因为IPersonName接口未定义该属性。
2. 创建仅包含接口属性的独立对象
如果需要的是一个只持有FirstName和LastName的独立对象(而非接口引用),可以用以下两种方式:
方式A:使用匿名类型
Dim p2 = New With { .FirstName = p.FirstName, .LastName = p.LastName }
匿名类型的对象仅包含你定义的两个属性,无法访问Age。
方式B:定义DTO类(复用场景)
如果需要在多处使用这个结构,可创建一个简单的数据传输类:
Public Class PersonNameDto Public Property FirstName As String Public Property LastName As String End Class ' 转换使用: Dim p2 As New PersonNameDto With { .FirstName = p.FirstName, .LastName = p.LastName }
补充说明
如果开启Option Strict On后仍能访问Age,大概率是代码中做了显式类型转换(比如DirectCast(p2, Person).Age),这种情况是刻意转回Person类型,自然能访问其属性。只要保持Option Strict On,并仅通过IPersonName类型的引用操作对象,就只会看到接口定义的成员。
内容的提问来源于stack exchange,提问作者MojoDK
相关产品推荐
相关产品推荐

