2010-01-07 5 views
3

Voici la situation ... Je veux être en mesure de passer un python lambda dans la méthode C# où l'évaluation du lambda devrait se produire. quand je passe dans le lambda, il devient une instance de PythonFunction. Je suis coincé ici car je ne sais pas comment exécuter cette fonction Python. Je vois un "appel" sur cette classe, mais je ne sais pas où obtenir le CodeContext dont il a besoin.(IronPython) Exécuter PythonFunction à partir de C#

Quelqu'un sait-il comment faire?

Répondre

4

Si vous ne voulez pas (ou ne pouvez pas) utiliser un délégué, la classe ObjectOperations est un meilleur pari. Il est accessible depuis engine.ObjectOperations (où engine est votre instance ScriptEngine).

if(engine.ObjectOperations.IsCallable(myfunction)) 
    engine.ObjectOperations.Invoke(myfunction, args); 

Cela dit, un délégué fortement typé (System.Action ou System.Func, ou un de vos propres) est une meilleure option. Vous pouvez utiliser engine.ObjectOperations.ConvertTo pour obtenir un délégué si la modification de la signature de fonction n'est pas une option.

2

Il y a une question similaire ici:

How to pass a lambda expression to a C# constructor from an IronPython script?

L'idée était d'utiliser un délégué System.Action d'accepter la fonction python, puis d'exécuter ce délégué comme vous le feriez pour tout autre. Je ne suis pas sûr à 100%, mais je pense que cela fonctionnera avec un lamda IronPython aussi longtemps que votre délégué System.Action correspondra.

J'espère que cela fonctionne pour vous.

+0

Ou System.Func si vous avez besoin d'un type de retour. –

0

Ok, j'ai tout compris:

var target = myfunction.__code__.Target; 
result = target.DynamicInvoke(new object[] {myfunction, argsForFunction}) 

où myfunction est une instance de PythonFunction.

+0

Préférez utiliser engine.ObjectOperations au lieu de vous fier aux détails de l'implmentation. –

+0

Vous avez raison. Je t'ai donné la réponse. Merci! –