如何从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()不能很好地表示大多数对象

如何从c#中获得DLR表示

当然,没有一种通用的方法可以将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");

你可能想看看是否有其他方法可以使用