品質保証テストを支援するためにIronPythonで自動化できるC#WebKitWebブラウザーを構築しています。いくつかのブラウザーメソッドを実行し、引数を提供し、結果を評価するIronPythonを使用してテストプランを作成します。
IronPythonのほとんどのドキュメントは、C#でIronPythonメソッドを呼び出す方法を示していますが、メソッドに引数を設定する方法と、メソッドの戻り値を取得する方法を理解しましたが、同じメソッドからではありません。以下の例では、メソッドに引数を渡し、メソッドがクラスメンバー変数を設定してから、別のメソッドでその値を取得していることに注意してください。
誰かがもっとエレガントなパターンを提案できますか?
using System; using System.Windows.Forms; using IronPython.Hosting; using Microsoft.Scripting; using Microsoft.Scripting.Hosting; namespace PythonScripting.TestApp { public partial class Form1 : Form { private ScriptEngine m_engine = Python.CreateEngine(); private ScriptScope m_scope = null; //used to call funcs by Python that dont need to return vals delegate void VoidFunc(string val); public Form1() { InitializeComponent(); } private void doSomething() { MessageBox.Show("Something Done", "TestApp Result"); } private string _rslt = ""; private string getSomething() { return _rslt; } private void setSomething(string val) { _rslt = val; } private void Form1_Load(object sender, EventArgs e) { m_scope = m_engine.CreateScope(); Func<string> PyGetFunction = new Func<string>(getSomething); VoidFunc PySetFunction = new VoidFunc(setSomething); m_scope.SetVariable("txt", txtBoxTarget); m_scope.SetVariable("get_something", PyGetFunction); m_scope.SetVariable("set_something", PySetFunction); } private void button1_Click(object sender, EventArgs e) { string code = comboBox1.Text.Trim(); ScriptSource source = m_engine.CreateScriptSourceFromString(code, SourceCodeKind.SingleStatement); try { source.Execute(m_scope); Func<string> result = m_scope.GetVariable<Func<string>>("get_something"); MessageBox.Show("Result: " + result(), "TestApp Result"); } catch (Exception ue) { MessageBox.Show("Unrecognized Python Error\n\n" + ue.GetBaseException(), "Python Script Error"); } } } }