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