代码之家  ›  专栏  ›  技术社区  ›  Daren Thomas

如何将Ironpython实例方法传递给'func<foo>类型的(c)函数参数`

  •  3
  • Daren Thomas  · 技术社区  · 14 年前

    我正在尝试将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)
    

    但我得到了以下错误:

    类型错误:应为func[foo],获得instanceMethod

    2 回复  |  直到 14 年前
        1
  •  2
  •   Daren Thomas    14 年前

    好啊。我想我可能找到了一个解决办法:

    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] 建设者:)

        2
  •  1
  •   Jeff Hardy    14 年前

    第一个选项是使用静态方法。为此,你必须使用 @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> 而是像最初尝试的那样传递实例方法。