C #, IronPython - импорт (?) Из нестатического класса - PullRequest
1 голос
/ 05 февраля 2012

У меня есть нестатический класс C # с некоторыми методами экземпляров, которые мне нужно вызывать из сценариев IronPython. В настоящее время я делаю это так:

scope.SetVariable("class", instanceOfClass);

в коде C # и

class.SomeMethod(args)

в сценарии.

Я хочу вызывать методы этого класса без добавления class. каждый раз в сценарии. У каждого скрипта есть свой экземпляр класса, и в одном скрипте используется только один экземпляр.

Если бы этот класс был статическим, решение было бы from ClassName import *, но, как я знаю, аналогичной конструкции для нестатических классов не существует.

Как это можно сделать? У меня есть некоторые идеи (такие как использование отражения или добавление class. к каждому вызову в исходном коде Python программно), но они слишком сложны и могут даже оказаться невозможными для реализации.

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

1 Ответ

2 голосов
/ 05 февраля 2012

from ClassName import * на самом деле from namespace import type.Этот оператор делает тип доступным для использования через имя типа в 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(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);
        }

печать

значение

...