2010-04-13 3 views
3

J'essaie d'affecter une méthode d'instance IronPython à un paramètre C# Func<Foo>.Comment passer une méthode d'instance IronPython à un paramètre de fonction (C#) de type `Func <Foo>`

En C# J'aurais une méthode comme:

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

et l'appeler de IronPython comme ceci:

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

Mais je reçois l'erreur suivante:

TypeError : expected Func [Foo], a reçu la méthode

Répondre

2

OK. Je pense que je pourrais avoir trouvé une solution:

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)) 

La partie intéressante est le constructeur Func[Foo] :)

1

La première option consiste à utiliser une méthode statique. Pour cela, vous devrez utiliser le @staticmethod décorateur:

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

CSharpClass().DoSomething(IronPythonClass.foobar) 

Si vous voulez qu'il soit une méthode d'instance, vous pouvez utiliser une méthode liée:

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

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

Enfin, vous devriez être capable de prendre un Func<object, Foo> à la place et passer la méthode d'instance comme vous avez essayé de le faire.

+0

oups. Manqué la partie 'self' dans mon exemple. –

+0

mais je maintiens que le runtime vérifie le type, donc vous devez envelopper 'IronPythonClass.foobar' dans un' Func [Foo] '. –

+0

Quelle version d'IronPython utilisez-vous? Le deuxième exemple (méthode liée) fonctionne pour moi w/2.6.0. –

Questions connexes