如何让泛型在Python.NET中使用CPython

如何让泛型在Python.NET中使用CPython,python,.net,clr,ironpython,python.net,Python,.net,Clr,Ironpython,Python.net,如何让泛型在Python.NET中使用CPython。使用中的下标语法时出错 使用Python 2.7.11+pythonnet==2.1.0.dev1 >python.exe Python 2.7.11 (v2.7.11:6d1b6a68f775, Dec 5 2015, 20:32:19) [MSC v.1500 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more inf

如何让泛型在Python.NET中使用CPython。使用中的下标语法时出错

使用Python 2.7.11+pythonnet==2.1.0.dev1

>python.exe
Python 2.7.11 (v2.7.11:6d1b6a68f775, Dec  5 2015, 20:32:19) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import clr
>>> from System import EventHandler
>>> from System import EventArgs
>>> EventHandler[EventArgs]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsubscriptable object
>python.exe
win32上的Python 2.7.11(v2.7.11:6D1B6A68F7752015年12月5日20:32:19)[MSC v.1500 32位(英特尔)]
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>导入clr
>>>从系统导入EventHandler
>>>从系统导入事件参数
>>>EventHandler[EventArgs]
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:取消订阅对象
我还尝试了pythonnet==2.0.0,并使用ReleaseWin x86构建了github ca15fe8表单,但得到了相同的错误

使用IronPython-2.7.5:

>ipy.exe
IronPython 2.7.5 (2.7.5.0) on .NET 4.0.30319.0 (32-bit)
Type "help", "copyright", "credits" or "license" for more information.
>>> import clr
>>> from System import EventHandler
>>> from System import EventArgs
>>> EventHandler[EventArgs]
<type 'EventHandler[EventArgs]'>
>ipy.exe
.NET4.0.30319.0(32位)上的IronPython 2.7.5(2.7.5.0)
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>导入clr
>>>从系统导入EventHandler
>>>从系统导入事件参数
>>>EventHandler[EventArgs]

这不起作用,因为
系统
命名空间中同时存在
事件处理程序
类的泛型和非泛型版本。名称已重载。您需要指出您想要通用版本

我不确定Python.NET到底是如何处理重载类/函数的,但它似乎有一个
重载
属性。试试这样的方法,看看效果如何:

EventHandler_EventArgs = EventHandler.Overloads[EventArgs]
(这不起作用)

Python.NET似乎没有解决重载类名的方法,每个重载都被视为单独的不同类型(使用它们的clr名称)。它没有做与IronPython相同的事情,并将它们合并到一个包含类型中


在这种特殊情况下,
EventArgs
名称对应于非泛型的
EventArgs
类型。您需要直接从系统模块获取适当的类型,如filmor所示。

您可以显式获取泛型类对象:

EventHandler = getattr(System, 'EventHandler`1')

这个数字表示泛型参数的数量。

您的ironpython示例不完整,这个问题与您在上一篇文章中提出的问题相比似乎过时了github@denfromufa我已经更新了我的例子。对于IronPython,下标语法按预期实例化EventHandler,但是对于CPython+Python.NET,它返回一个错误。当我尝试这样做时,我得到一个“TypeError:找不到与构造函数签名匹配的项”。嗯,我想
重载
属性只适用于方法(在本例中为构造函数)。如果pythonnet2.1没有提供一种本机实现这一点的方法,那将是一个遗憾。在pythonnet2.1中,您解决了这个问题!请编辑您的答案。
EventHandler = getattr(System, 'EventHandler`1')