在 OpenXML SDK 里面对于很多值,如字符串等的值,都包含一个 HasValue 属性。刚入门的小伙伴会认为这就是一个和可空类型一样的属性,表示这个属性是不是为空。其实这句话只是对一半,其实这个属性表示的是在重新定义的字符串参数里面的属性是否为空

在 OpenXML SDK 里面给很多基础类型都是自己新定义的,如 SingleValue 和 StringValue 等,这些定义都继承 OpenXmlSimpleType 类,而在 OpenXmlSimpleType 类就存在一个让刚入行的小伙伴会错误认为这是一个可空类型的 HasValue 属性

这个属性的命名刚好和可空类型相同,而刚好在 OpenXML SDK 里面存在大量的类型都是可能为空的。例如尝试获取文本的字体大小

    Int32Value fontSize = run.RunProperties.FontSize;

此时拿到了 fontSize 但是可能在 PPT 里面没有定义这个属性,也就是 fontSize 为空,此时如果没有判断就开始使用,将会在某些有趣的课件里面在这里炸掉

但是如果使用下面代码判断,将会如何?

    if (fontSize.HasValue)
    {
                
    }

哈哈,贺喜你踩到了这个 API 设计的坑,此时的 Int32Value 不是可空类型,也就是其实此时的 fontSize 是空,尝试获取他的属性将会炸掉

正确的做法是使用下面代码

if (fontSize != null)
{

}

那么这个 HasValue 的意思是什么?我将 OpenXmlSimpleType 的源代码写出来大家就知道了

        public virtual bool HasValue => TextValue != null;

没错,这个属性只是用来判断是否存在值,而不是判断自己本身是否是空


本文会经常更新,请阅读原文: https://blog.lindexi.com/post/dotnet-%E5%9C%A8-OpenXML-SDK-%E7%9A%84-HasValue-%E6%98%AF%E4%BB%80%E4%B9%88%E5%90%AB%E4%B9%89.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

如果你想持续阅读我的最新博客,请点击 RSS 订阅,推荐使用RSS Stalker订阅博客,或者前往 CSDN 关注我的主页

知识共享许可协议 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接: https://blog.lindexi.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系

以下是广告时间

推荐关注 Edi.Wang 的公众号

欢迎进入 Eleven 老师组建的 .NET 社区