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

如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 03:42:21