如何将IronPython实例方法传递给类型为`Func <foo>`</foo>的(C#)函数参数

时间:2010-04-13 15:04:56

标签: c# generics ironpython

我正在尝试将IronPython实例方法分配给C#Func<Foo>参数。

在C#中我会有一个方法:

public class CSharpClass
{
    public void DoSomething(Func<Foo> something)
    {
        var foo = something()
    }
}

然后从IronPython中调用它:

class IronPythonClass:
    def foobar(self):
        return Foo()
CSharpClass().DoSomething(foobar)

但我收到以下错误:

TypeError:期望Func [Foo],得到instancemethod

2 个答案:

答案 0 :(得分:2)

行。我想我可能找到了解决方案:

import clr
clr.AddReference('System')
clr.AddReference('System.Core')

from System import Func

class IronPythonClass:
def foobar(self):
    return Foo()

CSharpClass().DoSomething(Func[Foo](foobar))

有趣的是Func[Foo]构造函数:)

答案 1 :(得分:1)

第一种选择是使用静态方法。为此,您必须使用@staticmethod装饰器:

class IronPythonClass: 
    @staticmethod
    def foobar(): 
         return Foo() 

CSharpClass().DoSomething(IronPythonClass.foobar)

如果您确实希望它是实例方法,那么您可以使用绑定方法:

class IronPythonClass: 
    def foobar(self): 
         return Foo() 

ipc = IronPythonClass()
CSharpClass().DoSomething(ipc.foobar) # using ipc.foobar binds 'ipc' to the 'self' parameter

最后,您应该能够使用Func<object, Foo>代替并按原先的方式传递实例方法。