没有泛型的Pythonnet委托方法

时间:2018-10-02 16:32:57

标签: c# python generics delegates python.net

我正在将Python脚本与Pythonnet一起使用来驱动C#库。该库在某些事件上激发委托方法。我正在注册委托方法,但是没有被调用。

有问题的方法定义为event EventHandler<EventArgs> SystemInformationUpdated

有趣的是,正在调用另一个具有自定义类返回值的方法,定义为event EventHandler<PeripheralDiscoveredEventArgs> PeripheralDiscovered

当我使用IronPython运行此代码时,一切正常,因此我认为这是PythonNET问题。我的代码是这样的:

from System import EventHandler, EventArgs

(...)

dc = EventHandler[PeripheralDiscoveredEventArgs](centralOnPeripheralDiscovered_callback)
central.PeripheralDiscovered += dc

iuc = EventHandler[EventArgs](systemInformationUpdated_callback)
central.SystemInformationUpdated += iuc

在调用systemInformationUpdated_callback函数时,未执行centralOnPeripheralDiscovered_callback

我还尝试了以下代码:

from System import EventArgs

(...)

EventHandler = getattr(System, 'EventHandler`1')
dc = EventHandler[PeripheralDiscoveredEventArgs](centralOnPeripheralDiscovered_callback)
central.PeripheralDiscovered += dc

EventHandler = getattr(System, 'EventHandler`1')
iuc = EventHandler[EventArgs](systemInformationUpdated_callback)
central.SystemInformationUpdated += iuc

它也不起作用(因为我相信该错误已在PythonNET 2.2中得到纠正)。

使用我得到的控制台

dc
<0, Culture=neutral, PublicKeyToken=null]]>
iuc
<0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]>

iuc对象的Target属性是

Target  <__System_EventHandler`1\[\[System_EventArgs\, mscorlib\, Version=4_0_0_0\, Culture=neutral\, PublicKeyToken=b77a5c561934e089\]\]Dispatcher>    __System_EventHandler`1\[\[System_EventArgs\, mscorlib\, Version=4_0_0_0\, Culture=neutral\, PublicKeyToken=b77a5c561934e089\]\]Dispatcher

我看着Python for .NET readme:Using GenericsUnable to use Generics in CPython with Python.NETHow can I get generics to work in Python.NET with CPython

环境:

  • Python 3.6 64位,
  • PythonNET 2.3.0
  • .NET Framework 4.5.2
  • Windows 7 Enterprise 64位

非常感谢!

1 个答案:

答案 0 :(得分:1)

通过进一步的测试,我意识到正在调用该回调,对不起狼。我的回调如下:

def systemInformationUpdated_callback(sender, e):
    global central
    pdict = dict(central.SystemInformation)
    print "System Information:"
    for key, value in pdict.iteritems():
        print "    "+key+" = "+value

central.SystemInformationIDictionary<string, string>。问题在于PythonNET不会直接从它创建字典,而罪魁祸首就是这一行

pdict = dict(central.SystemInformation)

但这会无声地爆炸,不会引发任何异常,并且永远不会打印System Information:字符串。所以我以为从未调用过回调。

请注意,此代码可在IronPython上正常运行。

谢谢!