Запуск объекта IronPython из C # с динамическим ключевым словом - PullRequest
1 голос
/ 12 октября 2010

У меня есть следующий код IronPython.

class Hello:
    def __init__(self):
        pass
    def add(self, x, y):
        return (x+y)

Я мог бы сделать следующий код C # для использования кода IronPython.

static void Main()
{

    string source = GetSourceCode("ipyth.py");
    Engine engine = new Engine(source);
    ObjectOperations ops = engine._engine.Operations;

    bool result = engine.Execute();
    if (!result)
    {
        Console.WriteLine("Executing Python code failed!");
    }
    else
    {
        object klass = engine._scope.GetVariable("Hello");
        object instance = ops.Invoke(klass);
        object method = ops.GetMember(instance, "add");
        int res = (int) ops.Invoke(method, 10, 20);
        Console.WriteLine(res);
    }

    Console.WriteLine("Press any key to exit.");
    Console.ReadLine();
}

Могу ли я упростить этот код с динамическим DLR?

Книга IronPython In Action содержит простое объяснение в <15.4.4 Будущее взаимодействия с динамическими объектами>, но я не смог найти некоторые примеры.

ДОБАВЛЕНО

Я прилагаю исходный / пакетный файл для программы. Program.cs runme.bat

1 Ответ

5 голосов
/ 12 октября 2010

Да, динамический может сделать ваш код проще

        var source =
            @"
class Hello:
def __init__(self):
    pass
def add(self, x, y):
    return (x+y)

";

        var engine = Python.CreateEngine();
        var scope = engine.CreateScope();
        var ops = engine.Operations;

        engine.Execute(source, scope);
        var pythonType = scope.GetVariable("Hello");
        dynamic instance = ops.CreateInstance(pythonType);
        var value = instance.add(10, 20);
        Console.WriteLine(value);

        Console.WriteLine("Press any key to exit.");
        Console.ReadLine();
...