如何从C#获取DLR表示?
是否有将动态语言运行时(DLR)对象转换为字符串表示的通用方法?例如,这里有一个示例,其中检查了obj的几个特定类型(本例中为Python):如何从C#获取DLR表示?,c#,ironpython,ironruby,dynamic-language-runtime,C#,Ironpython,Ironruby,Dynamic Language Runtime,是否有将动态语言运行时(DLR)对象转换为字符串表示的通用方法?例如,这里有一个示例,其中检查了obj的几个特定类型(本例中为Python): 但我真的很想用自己的语言(IronPython、IronRuby等)来表示obj,而不必对每种类型进行比较。obj.ToString()不能很好地表示大多数对象。好的,没有一种通用的方法可以将DLR对象转换为它们的代表性字符串表示形式。它依赖于语言,不幸的是它们的实现方式不同 至少使用IronPython,您总是可以获得对内置模块的引用,然后在对象上调用
但我真的很想用自己的语言(IronPython、IronRuby等)来表示obj,而不必对每种类型进行比较。obj.ToString()不能很好地表示大多数对象。好的,没有一种通用的方法可以将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_()。否则,它实际上返回一个.NET对象,其中to_s
不存在并且不太可靠。我认为在脚本中这样做更容易
var engine = Ruby.CreateEngine();
string repr = (string)engine.Execute("[1, 2, 3, 4, 5].to_s");
您可能想四处看看,看看是否有其他方法可以使用。每个语言都可以有一个表示法(如果存在,则报告给s;如果存在,则报告给s),但没有具体的方法。你所能做的最好的事情就是列出一个与“ToString”相当的语言列表,并检查所有这些语言。但您不需要像示例中那样单独管理每种对象类型。很好,这对IronPython对象确实有效:它们在C#中似乎都有一个“repr”方法。但是IronRuby对象在C#级似乎没有“to#s”方法。我不明白为什么它在对象
类()上,我不太会做ruby或python,但我知道的告诉我,每个ruby对象都应该公开一个to#s
方法。另外,\uuuuu repr\uuuu
的等价物应该是inspect
(),而to\s
应该是python中的\uu str\uuuu
的等价物。我的部分问题是这些对象是独立对象,我不知道它们来自哪种语言。任务是通过一个共享的ScriptScope,该ScriptScope与语言无关,但显示对象在宿主语言(或某些通用表示形式)中的显示方式。我使用VirtualBlackBox的建议来寻找一个方法repr方法,该方法适用于IronPython,但我在IronRuby方法上找不到任何东西。对于未来的DLR语言,我也没有办法做到这一点。也许应该在所有语言的基础对象中添加一个ToRepr()方法。
var engine = Ruby.CreateEngine();
string repr = (string)engine.Execute("[1, 2, 3, 4, 5].to_s");