Как получить представление DLR из C #? - PullRequest
0 голосов
/ 09 ноября 2011

Существует ли общий метод преобразования объекта Dynamic Language Runtime (DLR) в строковое представление?Например, вот пример, где obj проверяется для пары определенных типов (в данном случае Python):

        if (obj is IronPython.Runtime.List) {
          repr = ((IronPython.Runtime.List)obj).__repr__(
                  IronPython.Runtime.DefaultContext.Default);
        } else if (obj is IronPython.Runtime.PythonDictionary) {
          repr = ((IronPython.Runtime.PythonDictionary)obj).__repr__(
                  IronPython.Runtime.DefaultContext.Default);

Но я действительно хотел бы получить представление obj на своем собственном языке (IronPython, IronRuby и т. Д.) И без необходимости сравнивать их с каждым типом.obj.ToString () не дает хорошего представления для большинства объектов.

1 Ответ

1 голос
/ 09 ноября 2011

AFAIK, нет единого общего метода для преобразования объектов DLR в их репрезентативные строковые представления.Это зависит от языка, и, к сожалению, они не реализованы одинаково.

По крайней мере с IronPython вы всегда можете просто получить ссылку на модуль Builtin, а затем вызвать функцию str() (или repr()) на вашемobjects.

var engine = Python.CreateEngine();
dynamic obj = engine.Execute("[1, 2, 3, 4, 5]");
dynamic builtin = engine.GetBuiltinModule();
string repr = builtin.str(obj);

Конечно, вы также можете вызывать функцию внутри скрипта.

string repr = (string)engine.Execute("str([1, 2, 3, 4, 5])");

Другой вариант - использовать одну из многих операций, определенных в пространстве имен IronPython.Runtime.Operations..

string repr = IronPython.Runtime.Operations.PythonOps.ToString(obj);

Я не очень знаком с IronRuby, но вызов to_s() для некоторых объектов иногда срабатывает.В противном случае он на самом деле возвращает объект .NET, где to_s не существует и не очень надежен.Я думаю, что это проще сделать в скрипте.

var engine = Ruby.CreateEngine();
string repr = (string)engine.Execute("[1, 2, 3, 4, 5].to_s");

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

...