我有一个带有一些实例方法的非静态C#类,我需要从IronPython脚本中调用它们。目前我这样做:
scope.SetVariable("class", instanceOfClass);
在C#代码和
中class.SomeMethod(args)
在剧本中。
我想要的是能够在脚本中每次都不添加class.
来调用此类方法。每个脚本都有自己的类实例,并且在一个脚本中只使用一个实例。
如果这个类是静态的,那么解决方案将是from ClassName import *
,但据我所知,非静态类没有类似的构造。
如何做到这一点?我有一些想法(例如使用反射,或者以编程方式在Python源代码中为每个调用添加class.
),但它们过于复杂,甚至可能无法实现。
UPD:
使用这样的python代码解决问题(在实际脚本之前):
def Method1(arg1): # for simple method
class.Method1(arg1)
def Method2(arg = 123): # for default values
class.Method2(arg)
def Method3(*args): # for params
class.Method3(args)
# so on
答案 0 :(得分:2)
from ClassName import *
实际上是from namespace import type
。此语句使类型可以通过Python中的类型名称使用。如果类是静态的,它没有区别。请考虑以下示例代码 - Environment是静态类。
import clr
from System import Environment
print Environment.CurrentDirectory
要解决您的问题,请将类函数的委托注入ScriptScope,而不是类本身。
示例类
public class Foo {
public string GetMyString(string input) {
return input;
}
}
用法
private static void Main(string[] args) {
ScriptEngine engine = Python.CreateEngine();
string script = "x = GetMyString('value')";
Foo foo = new Foo();
ScriptSource scriptSource = engine.CreateScriptSourceFromString(script);
ScriptScope scope = engine.CreateScope();
scope.SetVariable("GetMyString", new Func<string, string>(foo.GetMyString));
scriptSource.Execute(scope);
string output = scope.GetVariable<string>("x");
Console.WriteLine(output);
}
打印
值