如何从C#获取DLR表示?

时间:2011-11-08 21:42:47

标签: 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);

但我真的想用自己的语言(IronPython,IronRuby等)来表示obj,而不必与每种类型进行比较。 obj.ToString()没有为大多数对象提供良好的表示。

1 个答案:

答案 0 :(得分:1)

AFAIK,没有一种常用的方法可以将DLR对象转换为代表性的字符串表示形式。它依赖于语言,遗憾的是它们的实现并不相同。

至少使用IronPython,你总是可以获得对Builtin模块的引用,然后调用对象上的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");

您可能想环顾四周,看看是否还有其他可以使用的方法。