VB.NET开启Option Strict On时Office类型库枚举窄化转换的更优方案
解决方案
以下是几种比批量加CShort()更优雅的实现方案,按推荐优先级排序:
方案1:编写Office对象的扩展方法重载(最推荐)
通过扩展方法为涉及枚举参数的Visio方法添加强类型重载,内部自动完成类型转换,原有业务代码无需任何修改即可正常运行。
示例代码如下:
Imports System.Runtime.CompilerServices Imports Visio = Microsoft.Office.Interop.Visio ' 全局扩展模块 Public Module VisioMethodExtensions ' 为Shape的UniqueID方法添加枚举参数的重载 <Extension> Public Function UniqueID(targetShape As Visio.Shape, idArg As Visio.VisUniqueIDArgs) As String Return targetShape.UniqueID(CShort(idArg)) End Function ' 其他涉及枚举参数的方法可按照相同逻辑批量添加重载 ' 例:含多个枚举参数的方法 <Extension> Public Sub SomeMethod(target As Visio.SomeObject, arg1 As Visio.Enum1, arg2 As Visio.Enum2, arg3 As Visio.Enum3) target.SomeMethod(CShort(arg1), CShort(arg2), CShort(arg3)) End Sub End Module
配置完成后,原有调用代码UUID = vsoShape.UniqueID(Visio.VisUniqueIDArgs.visGetOrMakeGUIDWithUndo)可直接正常执行,完全保留原有代码可读性。
方案2:全局定义枚举值的Short类型别名
对于高频使用的枚举值,可以在公共模块中预定义转换完成的Short类型常量,调用时直接使用常量即可:
Public Module VisioEnumConstants ' 预转换所有需要用到的枚举值 Public Const visGetOrMakeGUIDWithUndo As Short = CShort(Visio.VisUniqueIDArgs.visGetOrMakeGUIDWithUndo) Public Const visGetGUID As Short = CShort(Visio.VisUniqueIDArgs.visGetGUID) ' 其他枚举值同理添加 End Module
调用代码简化为:
UUID = vsoShape.UniqueID(visGetOrMakeGUIDWithUndo)
方案3:自定义修改互操作程序集(进阶方案)
如果熟悉COM互操作程序集的编译逻辑,可以将Visio互操作DLL反编译后,修改对应枚举的底层类型从Integer改为Short,再重新编译生成自定义互操作程序集。项目引用修改后的程序集后,无需任何额外代码即可彻底消除类型转换报错,一劳永逸。操作前请备份原有互操作程序集,避免兼容性问题。
内容的提问来源于stack exchange,提问作者DotNET Afficionado
相关产品推荐
相关产品推荐

