无法将对象转换为 vb.net 中的字符串数组,但我可以在 C#.net(核心)中
Cannot convert an object to a string-array in vb.net but I can in C#.net (core)
我无法在 VB.net 中将对象转换为字符串数组(或集合),我可以在 C# 中做到。
VB.net代码:
Runtime.PythonDLL = "/usr/lib/python3.9/config-3.9-x86_64-linux-gnu/libpython3.9.so"
Using Py.GIL
Dim APT As Object = Py.Import("apt")
Dim Cache As Object = APT.Cache()
Dim PyObj As Object = Cache.keys()
Dim PKGs As String() = CType(PyObj, String())
End Using
我得到异常 Unable to cast object of type 'Python.Runtime.PyObject' to type 'System.String[]'.
有效的 C#.net 代码:
Runtime.PythonDLL = "/usr/lib/python3.9/config-3.9-x86_64-linux-gnu/libpython3.9.so";
using (Py.GIL())
{
dynamic APT = Py.Import("apt"); // Type: dynamic {Python.Runtime.PyModule}, <module 'apt' from '/usr/lib/python3/dist-packages/apt/__init__.py'>
dynamic Cache = APT.Cache(); // Type: dynamic {Python.Runtime.PyModule}, <apt.cache.Cache object at 0x7fa701ec6760>
dynamic PyObj = Cache.keys(); // Type: dynamic {Python.Runtime.PyModule}, ['0ad', '0ad-data',...]
String[] PKGs = (String[])PyObj;
}
我在 vb.net 和 C#.net 的调试器中看到了相同的结果。
vb.net 中的调试器:
C#.net 中的调试器:
我知道我在 C# 中使用 dynamic
类型,在 VB 中使用 Object
。我确实在 VB 中使用选项 strict=Off。
据我所知,VB 没有 dynamic
,但我假设如果 strict=Off,您可以使用 Object
。
也许这就是原因,但这是不可能的?
我也尝试转换为:
- 数组列表
- 列表(字符串)
- HasetSet(字符串)
- 字典(字符串、对象)
尝试了 TryCast、DirectCast 和 CType.
除了@Jeroen Mostert 的解决方案,我更喜欢它,因为它更通用,我确实在 Python.net 库中找到了一个方法来完成这项工作:pyObject.As<T>()
Runtime.PythonDLL = "/usr/lib/python3.9/config-3.9-x86_64-linux-gnu/libpython3.9.so"
Using Py.GIL
Dim APT As Object = Py.Import("apt")
Dim Cache As Object = APT.Cache()
Dim PyObj As PyObject = Cache.keys()
Dim PKGs As String() = PyObj.As(Of String())() '<==========
Console.WriteLine(PKGs(0))
End Using
PythonEngine.BeginAllowThreads() 'Must be called to release the Py.GIL thread!
我无法在 VB.net 中将对象转换为字符串数组(或集合),我可以在 C# 中做到。
VB.net代码:
Runtime.PythonDLL = "/usr/lib/python3.9/config-3.9-x86_64-linux-gnu/libpython3.9.so"
Using Py.GIL
Dim APT As Object = Py.Import("apt")
Dim Cache As Object = APT.Cache()
Dim PyObj As Object = Cache.keys()
Dim PKGs As String() = CType(PyObj, String())
End Using
我得到异常 Unable to cast object of type 'Python.Runtime.PyObject' to type 'System.String[]'.
有效的 C#.net 代码:
Runtime.PythonDLL = "/usr/lib/python3.9/config-3.9-x86_64-linux-gnu/libpython3.9.so";
using (Py.GIL())
{
dynamic APT = Py.Import("apt"); // Type: dynamic {Python.Runtime.PyModule}, <module 'apt' from '/usr/lib/python3/dist-packages/apt/__init__.py'>
dynamic Cache = APT.Cache(); // Type: dynamic {Python.Runtime.PyModule}, <apt.cache.Cache object at 0x7fa701ec6760>
dynamic PyObj = Cache.keys(); // Type: dynamic {Python.Runtime.PyModule}, ['0ad', '0ad-data',...]
String[] PKGs = (String[])PyObj;
}
我在 vb.net 和 C#.net 的调试器中看到了相同的结果。
vb.net 中的调试器:
C#.net 中的调试器:
我知道我在 C# 中使用 dynamic
类型,在 VB 中使用 Object
。我确实在 VB 中使用选项 strict=Off。
据我所知,VB 没有 dynamic
,但我假设如果 strict=Off,您可以使用 Object
。
也许这就是原因,但这是不可能的?
我也尝试转换为:
- 数组列表
- 列表(字符串)
- HasetSet(字符串)
- 字典(字符串、对象)
尝试了 TryCast、DirectCast 和 CType.
除了@Jeroen Mostert 的解决方案,我更喜欢它,因为它更通用,我确实在 Python.net 库中找到了一个方法来完成这项工作:pyObject.As<T>()
Runtime.PythonDLL = "/usr/lib/python3.9/config-3.9-x86_64-linux-gnu/libpython3.9.so"
Using Py.GIL
Dim APT As Object = Py.Import("apt")
Dim Cache As Object = APT.Cache()
Dim PyObj As PyObject = Cache.keys()
Dim PKGs As String() = PyObj.As(Of String())() '<==========
Console.WriteLine(PKGs(0))
End Using
PythonEngine.BeginAllowThreads() 'Must be called to release the Py.GIL thread!