python3 pythonnet泛型委托

时间:2015-06-05 06:38:47

标签: c# python generics callback python.net

我在windows7上安装了64位CPython 3.4。我使用pythonnet包(2.0.0.dev1)。 我想实例化动作委托,但它给了我一个错误。

def display(num):
     print("num=", num)

import clr
clr.AddReference("System")
import System

paction=System.Action[System.Int32](display)

我收到此错误:

  

TypeError Traceback(最近一次调用最后一次)    in()   ----> 1 paction = System.Action [System.Int32](显示)   TypeError:unsubscriptable对象

我想这是指定泛型的方式。

我已经检查了文档和this帖子,但仍然没有看到问题。 我还使用Overload方法进行了一些调整,但也没有帮助:

paction=System.Action.Overloads[System.Int32](display)
  

TypeError Traceback(最近一次调用最后一次)    in()   ----> 1 paction = System.Action.Overloads [System.Int32](显示)   TypeError:找不到构造函数签名的匹配项

2 个答案:

答案 0 :(得分:2)

问题是System.Action(没有参数,因此不是通用的)是阴影System.Action<T>System.Func直接映射到System.Func<T>。我想这是因为System.Func 总是具有通用参数,并且似乎存在针对泛型的重载实现。

Python.NET中的泛型名称为Action`1(一般来说:Action`N,其中N是泛型参数的数量)。您可以使用模块上的getattr来获取包装器对象:

Action = getattr(System, "Action`1")
action = Action[Int32](display)

答案 1 :(得分:1)

我也面临这个问题。我创建了一个在Python.Net中使用Actions的工作

使用以下代码创建.net类库项目:

using System;

namespace PythonHelper
{
    public class Generics
    {

        public static Action<T1, T2> GetAction<T1, T2>(Func<T1, T2, object> method)
        {
            return (a, b) => method(a,b);
        }

    }
}

将其编译为dll文件并将其包含在Python.net项目中(clr.AddReference('PythonHelper')

现在,在您的Python.net项目中,您可以使用以下代码创建泛型:

import clr
clr.AddReference('PythonHelper')
import System
from System import DateTime, Func
from PythonHelper import Generics

def myCallback(a,b):
    print a, b

func = Func[DateTime, DateTime, System.Object](myCallback)
action = Generics.GetAction[DateTime, DateTime](func)

如果您需要创建一个包含更多或更少参数的动作,您必须自己添加另一个GetAction方法。