Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从C#获取DLR表示?_C#_Ironpython_Ironruby_Dynamic Language Runtime - Fatal编程技术网

如何从C#获取DLR表示?

如何从C#获取DLR表示?,c#,ironpython,ironruby,dynamic-language-runtime,C#,Ironpython,Ironruby,Dynamic Language Runtime,是否有将动态语言运行时(DLR)对象转换为字符串表示的通用方法?例如,这里有一个示例,其中检查了obj的几个特定类型(本例中为Python): 但我真的很想用自己的语言(IronPython、IronRuby等)来表示obj,而不必对每种类型进行比较。obj.ToString()不能很好地表示大多数对象。好的,没有一种通用的方法可以将DLR对象转换为它们的代表性字符串表示形式。它依赖于语言,不幸的是它们的实现方式不同 至少使用IronPython,您总是可以获得对内置模块的引用,然后在对象上调用

是否有将动态语言运行时(DLR)对象转换为字符串表示的通用方法?例如,这里有一个示例,其中检查了obj的几个特定类型(本例中为Python):


但我真的很想用自己的语言(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");