C#,IronPython-从非静态类导入(?)

C#,IronPython-从非静态类导入(?),c#,class,ironpython,C#,Class,Ironpython,我有一个非静态C#类,其中包含一些实例方法,我需要从IronPython脚本中调用这些方法。目前我是这样做的: scope.SetVariable("class", instanceOfClass); 在C#代码和 用脚本 我想要的是能够调用此类方法,而无需每次在脚本中添加类。。每个脚本都有自己的类实例,一个脚本中只使用一个实例 如果这个类是静态的,那么解决方案将是来自ClassName import*的,但正如我所知,对于非静态类没有类似的构造 如何做到这一点?我有一些想法(比如使用反射,或

我有一个非静态C#类,其中包含一些实例方法,我需要从IronPython脚本中调用这些方法。目前我是这样做的:

scope.SetVariable("class", instanceOfClass);
在C#代码和

用脚本

我想要的是能够调用此类方法,而无需每次在脚本中添加
类。
。每个脚本都有自己的类实例,一个脚本中只使用一个实例

如果这个类是静态的,那么解决方案将是来自ClassName import*的
,但正如我所知,对于非静态类没有类似的构造

如何做到这一点?我有一些想法(比如使用反射,或者以编程方式向Python源代码中的每个调用添加
类。
),但它们过于复杂,甚至可能无法实现

UPD:

通过使用此类python代码(在实际脚本之前)解决的问题:


来自类名导入的
实际上是来自命名空间导入类型的
。此语句通过Python中的类型名使该类型可用。类是否是静态的没有区别。将此示例代码环境视为静态类。

import clr
from System import Environment
print Environment.CurrentDirectory
为了解决您的问题,将类函数的委托注入到ScriptScope中,而不是类本身

样本类

 public class Foo {
        public string GetMyString(string input) {
            return input;
        }
    }
用法

private static void Main(字符串[]args){
ScriptEngine=Python.CreateEngine();
string script=“x=GetMyString('value')”;
Foo-Foo=新的Foo();
ScriptSource ScriptSource=engine.CreateScriptSourceFromString(脚本);
ScriptScope scope=engine.CreateScope();
SetVariable(“GetMyString”,newfunc(foo.GetMyString));
scriptSource.Execute(范围);
字符串输出=scope.GetVariable(“x”);
控制台写入线(输出);
}
印刷品

价值观


当然,它可以工作,但是这个类有很多方法,其中一些方法带有
params
参数和默认值,因此(我认为)不可能为所有这些方法创建
Func
s和
Action
s。关于导入-类似于从System.Console导入的
,然后是
WriteLine(123)
工作,因此,它不仅从名称空间导入类型,还从类型导入方法。您可能不想将类型的成员导入全局范围,我不相信这会提供大多数Python用户都熟悉的体验。我对可选参数进行了一次尝试,我相信您必须在C#类中创建重载,这样来自Python的调用将被定向到正确的成员,因为来自脚本的调用将通过注入的委托进行调用签名必须匹配。不过,您可以使用自己的委托类型包装params[]参数,这是一个简单的修复方法。为什么不导入?与普通的python程序相比,脚本应该相当短。此外,脚本中的大多数操作都是使用这个类执行的(问题是关于这个类),因此将方法导入全局范围是有意义的。
import clr
from System import Environment
print Environment.CurrentDirectory
 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);
        }