Доступ к хост-классу из скрипта IronPython - PullRequest
5 голосов
/ 04 июня 2011

Как получить доступ к классу C # из скрипта IronPython? C #:

public class MyClass
{
}

public enum MyEnum
{
    One, Two
}

var engine = Python.CreateEngine(options);
var scope = engine.CreateScope();
scope.SetVariable("t", new MyClass());
var src = engine.CreateScriptSourceFromFile(...);
src.Execute(scope);

Сценарий IronPython:

class_name = type(t).__name__     # MyClass
class_module = type(t).__module__ # __builtin__

# So this supposed to work ...
mc = MyClass() # ???
me = MyEnum.One # ???

# ... but it doesn't

UPDATE

Мне нужно импортировать классы, определенные в сборке хоста.

1 Ответ

3 голосов
/ 04 июня 2011

Вы установили t для экземпляра из MyClass, но вы пытаетесь использовать его, как если бы это был сам класс.

Вам нужно будет либо импортировать MyClass из скрипта IronPython, либо внедрить какой-то фабричный метод (поскольку классы не являются первоклассными объектами в C #, вы не можете напрямую передать MyClass) , В качестве альтернативы вы можете передать typeof(MyClass) и использовать System.Activator.CreateInstance(theMyClassTypeObject) для создания нового экземпляра.

Так как вам также необходим доступ к MyEnum (обратите внимание, что вы используете его в своем скрипте без каких-либо ссылок на то, откуда он может прийти), я предлагаю просто использовать импорт:

import clr
clr.AddReference('YourAssemblyName')

from YourAssemblyName.WhateverNamespace import MyClass, MyEnum

# Now these should work, since the objects have been properly imported
mc = MyClass()
me = MyEnum.One

Возможно, вам придется поиграться с типом источника сценария (я думаю, File работает лучше всего) и путем выполнения сценария, чтобы вызов clr.AddReference() был успешным.

...