是否存在将动态语言运行时(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()没有为大多数对象提供良好的表示。
答案 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");
您可能想环顾四周,看看是否还有其他可以使用的方法。