Как получить представление DLR из C #?

#c# #ironpython #ironruby #dynamic-language-runtime

#c# #ironpython #ironruby #динамический язык выполнения

Вопрос:

Существует ли общий метод преобразования объекта среды выполнения 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. Ну, вы могли бы получить одно представление для каждого языка ( repr , если оно существует to_s, если оно существует, то toString в противном случае), но конкретного способа нет. Лучшее, что вы могли бы сделать, это иметь список эквивалентных языку «toString» и проверять их все. Но вам не нужно, как в вашем примере, управлять каждым типом объекта отдельно.

2. Хорошо, это работает для объектов IronPython: похоже, что у всех них есть метод » repr » в C #. Но не похоже, что объекты IronRuby имеют метод «to_s» на уровне C #.

3. Я не могу понять, почему, поскольку это находится в Object классе ( ruby-doc.org/core-1.9.3/Object.html#method-i-to_s ) я не очень разбираюсь в ruby или python, но то, что я знаю, говорит мне, что каждый объект ruby должен предоставлять to_s метод. Также предполагается, что эквивалентом __repr__ должно быть inspect ( ruby-doc.org/core-1.9.3/Object.html#method-i-inspect ) предполагается, что while to_s является эквивалентом __str__ в python.

Ответ №1:

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

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

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

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

Комментарии:

1. Часть моей проблемы заключается в том, что это автономные объекты, и я не знаю, с какого языка они взяты. Задача состоит в том, чтобы пройти через разделяемый ScriptScope, который не зависит от языка, но показывает объекты так, как они отображаются на языке хоста (или в некотором общем представлении). Я воспользовался предложением VirtualBlackFox для поиска метода repr , и это работает для IronPython, но я ничего не могу найти о методах IronRuby. У меня также не было бы способа сделать это для будущих языков DLR. Возможно, метод ToRepr() следует добавить к базовому объекту на всех языках.