【问题标题】:C#, IronPython - import(?) from a non-static classC#,IronPython - 从非静态类导入(?)
【发布时间】:2012-02-05 21:47:38
【问题描述】:

我有一个带有一些实例方法的非静态 C# 类,我需要从 IronPython 脚本中调用它们。目前我正在这样做:

scope.SetVariable("class", instanceOfClass);

在 C# 代码中和

class.SomeMethod(args)

在脚本中。

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

如果这个类是静态的,解决方案是from ClassName import *,但据我所知,非静态类没有类似的构造。

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

更新:

使用此类 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

【问题讨论】:

    标签: c# class ironpython


    【解决方案1】:

    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);
            }
    

    打印

    价值

    【讨论】:

    • 当然可以,但是该类有很多方法,其中一些带有params 参数和默认值,因此(我认为)不可能创建Func&lt;&gt;s 和@987654328 @s 给他们所有人。
    • 关于导入 - 像 from System.Console import *WriteLine(123) 这样的代码有效,因此它不仅从命名空间导入类型,还从类型导入方法。
    • 您可能不想将该类型的成员导入全局范围,我认为这不会提供大多数 Python 用户熟悉的体验。
    • 我玩过可选参数,我相信您将不得不在 C# 类中创建重载,以便来自 Python 的调用将被定向到正确的成员,因为来自脚本的调用是通过注入的委托调用,因此签名必须匹配。你可以用你自己的委托类型包装 params[] 参数,这是一个简单的修复。
    • 为什么不导入?与普通的 python 程序相比,脚本应该相当短。此外,脚本中的大部分操作都是使用这个类执行的(问题是),因此将方法导入全局范围是有意义的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    • 1970-01-01
    • 2012-07-31
    相关资源
    最近更新 更多