VB.NET无法将PyObject转换为字符串数组而C#可正常转换该如何处理?
问题根因
你判断的方向是正确的,转换失败的核心原因就是VB.NET的晚绑定Object无法等价替代C#的dynamic类型:
- C#的dynamic类型在运行时会自动识别Python.Runtime.PyObject类定义的自定义显式转换运算符,所以可以直接强制转成String数组。
- VB.NET即便开启Option Strict Off,晚绑定的Object类型做类型转换时只会走.NET原生的转换规则,不会触发PyObject内置的自定义转换逻辑,因此直接CType/DirectCast/TryCast都会失败。
解决方案
直接使用Python.NET为PyObject提供的内置泛型转换方法As(Of T)即可,修改后的VB代码如下:
Runtime.PythonDLL = "/usr/lib/python3.9/config-3.9-x86_64-linux-gnu/libpython3.9.so" Using Py.GIL ' 直接声明为PyObject类型,而非Object Dim APT As PyObject = Py.Import("apt") Dim Cache As PyObject = APT.Cache() Dim PyObj As PyObject = Cache.keys() ' 调用内置泛型方法转换 Dim PKGs As String() = PyObj.As(Of String())() End Using
如果遇到特殊场景下批量转换失败,也可以手动枚举元素逐个转换:
Dim PKGs As New List(Of String) For Each key As PyObject In PyObj PKGs.Add(key.As(Of String)()) Next ' 按需转数组/HashSet/ArrayList等其他集合类型 Dim pkgArray As String() = PKGs.ToArray() Dim pkgHashSet As HashSet(Of String) = New HashSet(Of String)(PKGs)
内容的提问来源于stack exchange,提问作者MrCalvin
相关产品推荐
相关产品推荐

