2

这个SO question 提供了在 C# 中创建 python 类的实例的代码。

下面的代码强制提前知道python函数名。但是我需要指定要由字符串执行的类名和函数名。

ScriptEngine engine = Python.CreateEngine();
ScriptSource source = engine.CreateScriptSourceFromFile("Calculator.py");
ScriptScope scope = engine.CreateScope();
source.Execute(scope);

dynamic class_object = scope.GetVariable("Calculator");
dynamic class_instance = class_object();
int result = class_instance.add(4, 5);  // I need to call the function by a string
4

2 回答 2

2

最简单的方法是安装名为Dynamitey. 它专门设计用于在动态对象上调用动态方法(和做其他有用的事情)。安装后,只需执行以下操作:

static void Main(string[] args)
{
    ScriptEngine engine = Python.CreateEngine();
    ScriptSource source = engine.CreateScriptSourceFromFile("Calculator.py");
    ScriptScope scope = engine.CreateScope();
    source.Execute(scope);

    dynamic class_object = scope.GetVariable("Calculator");
    dynamic class_instance = class_object();
    int result = Dynamic.InvokeMember(class_instance, "add", 4, 5);
}

如果您想知道它在幕后做了什么 - 它使用 C# 编译器用于动态调用的相同代码。这是一个很长的故事,但是如果您想了解此内容,例如可以在此处进行。

于 2016-06-09T10:24:10.920 回答
0

您正在寻找 Invoke 和 InvokeMember IronPython 方法:

ScriptEngine engine = Python.CreateEngine();
ScriptSource source = engine.CreateScriptSourceFromFile("Calculator.py");
ScriptScope scope = engine.CreateScope();
source.Execute(scope);

object class_object = scope.GetVariable("Calculator");
object class_instance = engine.Operations.Invoke(class_object);
object[] args = new object[2];
args[0] = 4;
args[1] = 5;
int result = (int)engine.Operations.InvokeMember(class_instance, "add", args);  // Method called by string
                                                                                //  "args" is optional for methods which don't require arguments.

我还将dynamic类型更改为object,因为此代码示例不再需要它,但如果您需要调用一些固定名称的方法,您可以自由保留它。

于 2018-10-11T13:17:58.120 回答