如何从c#中获得DLR表示
本文关键字:DLR 表示 | 更新日期: 2023-09-27 18:13:46
是否有将动态语言运行时(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()不能很好地表示大多数对象
当然,没有一种通用的方法可以将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");
你可能想看看是否有其他方法可以使用