三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

C#基础:调试存在变量,但是代码访问不到?一文教你如何处理编译时类型和运行时类型不一致!

C#基础:调试存在变量,但是代码访问不到?一文教你如何处理编译时类型和运行时类型不一致!

一、情景重现

我在即使窗口输入:message.From[0]

输出如下信息:

{"123456" [123456@qq.com](mailto:123456@qq.com)} Address: "123456@qq.com" Domain: "[qq.com](https://link.wtturl.cn/?target=https%3A%2F%2Fqq.com&scene=im&aid=497858&lang=zh)" Encoding: {System.Text.UTF8Encoding.UTF8EncodingSealed} IsInternational: false LocalPart: "123456" Name: "123456" Route: {}

为何我写代码时,访问不到Address,例如我输入:

message.From[0].Address

会显示Address变量不存在(点不出 Address)

二、原因

message.From编译时类型声明为InternetAddressList(抽象基类),只包含少量属性(不含Address),但是调试器输出的是运行时实际类型MailboxAddress(它的子类),C# 是强类型语言,编译期只能访问声明类型的成员,因此访问不到其子类内容。

三、如何处理

1.通过反射查询其子类

即使窗口输入:message.From[0].GetType()

输出信息:

{Name = "MailboxAddress" FullName = "MimeKit.MailboxAddress"} Assembly: {MimeKit, Version=4.17.0.0, Culture=neutral, PublicKeyToken=bede1c8a46c66814} AssemblyQualifiedName: "MimeKit.MailboxAddress, MimeKit, Version=4.17.0.0, Culture=neutral, PublicKeyToken=bede1c8a46c66814" Attributes: Public

从中可得Name =MailboxAddress,是它的子类

2.强制类型转化并访问

知道其子类后,转化一下再点出来,即输入如下信息即可获取:

(message.From[0] as MailboxAddress)?.Address

输出:

123456@qq.com
← 返回列表