2009-09-11 8 views
1

Je peux récupérer une classe IronPython 2 sur mon C#. Quelle est la nouvelle façon d'appeler un membre IronPython 2 sur cette classe?Comment appeler une méthode IronPython 2 à partir de C#

object ironPythonClass = scope.GetVariable("Hamish"); 
object[] args = new object[0]; 
object pythonObject = engine.Operations.Call(ironPythonClass, args); 

var member = "Home"; 
// old way IronPython 1 
// var methodResult = Ops.Invoke(this.pythonObject, SymbolTable.StringToId(member), args); 

Je pensais que tout ce que je devais faire était

var methodResult = PythonOps.Invoke(codeContext, pythonObject, SymbolTable.StringToId(member), args); 

mais la création d'un CodeContext factice ne semble pas avoir raison. Je me sens comme si je devrais être en mesure de tirer un de mes

code.Execute(); 

qui exécute le fichier Python création de la classe, plus la portée qui découle de cette exécution.

Répondre

3

trouvé un moyen de le faire:

var ops = engine.Operations; 
var x = ops.GetMember(pythonObject, member); 
var h = ops.Call(x, new object[0]); 

On dirait que les opérations produit un OperationsObject qui a des membres utiles.

En regardant le code DLR (de Microsoft.Scripting.Hosting) mais je vois cet appel est dépréciée:

[Obsolete("Use Invoke instead")] 
public object Call(object obj, params object[] parameters) { 
    return _ops.Invoke(obj, parameters); 
} 

Ma version de script 0.9.20209, n'a cependant pas encore Invoke.

Après la mise à jour à la nouvelle IronPython 2.6Beta et ses dll de script, je trouve que je peux écrire:

var h = ops.InvokeMember(pythonObject, member, new object[0]); 
+0

Mise à jour à la version bêta 2.6 avec les DLLs de script plus récents - Je peux maintenant écrire: var h = ops. InvokeMember (pythonObject, membre, nouvel objet [0]); –

Questions connexes