编程实现立即窗口输出

3
我有一个应用程序,它使用Roslyn的脚本引擎实现了自己的C#控制台。我已经得到了执行语句并获取可能的返回值的代码,现在我想要将一个“好看”的字符串输出到控制台。直接调用“ToString()”的基本方法通常会产生非常难以理解的人类输出。
对我来说最好的解决方案是拥有与Visual Studio的“即时窗口”相同类型的检查输出。
例如,如果我的语句计算为new string[]{"asd"},那么只需调用ToString()将给我以下输出:
System.String[]

我希望获得类似“Immediate Window”输出的等效结果 - 类似于这样:

{string[1]}
    [0]: "asd"

有人知道如何调用与即时窗口使用相同的转换吗?

2
我最接近实现这个目标的方法是使用所描述的“对象转储器”,可以在这里这里找到相关信息。 - Cristian Lupascu
谢谢,非常有趣。我会让这个问题保持一定的开放性,希望能找到一个API访问实际即时窗口转换的方法(因为我的用户也将使用Visual Studio,所以那确实是最好和“最熟悉”的输出),但这些链接肯定包含了很好的“人类可读取的转储”示例。 - Imi
2个回答

1
似乎您有一个包含单个字符串的字符串数组,并且您对该数组调用了.ToString()。 请尝试替换。

为其他内容。
.ToString()

使用

[0].ToString()

并查看是否能够得到预期结果。


使用字符串数组只是一个快速示例,以展示立即窗口与ToString()标准实现之间的良好输出。我想到的代码应该适用于各种对象。 - Imi
请给出一个实际的例子 - 你正在调用 .ToString() 方法的对象是什么?它是你自己定义的类吗?如果是这样,那么你必须在该类中重写 ToString() 方法并返回所需的文本。 - Daniel
我不能提供实际示例,因为它是一个通用控制台,应该与各种对象(或至少“大多数”)一起看起来很好。任何特定的示例(如上面的string [])都会分散注意力,而无法*通用地显示未知对象的问题。我也无法在目标对象上实现任何方法,因为我没有控制类(并且该类可能在我编写控制台代码时根本不存在)。当然,我可以使用反射和测试常见类型来编写自己的显示代码,但我的问题是关于我可以重复使用的内置方法。 - Imi
在这种情况下,它是正确的。您可以包括一些通用的考虑因素,例如为数组显示不同的元素(如果需要-我的答案向您展示了如何实现),但除此之外,由.ToString() 显示的内容取决于编写您正在检查的对象的人,并且您不应该覆盖他对对象在调用ToString()时应返回什么的决定。 - Daniel

1

除了之前的评论/答案,您可以使用任何输出人类可读值的序列化器。我用过Json.NET:

string humanReadable = JsonConvert.SerializeObject(someObj, Formatting.Indented);

Nuget包:http://nuget.org/packages/Newtonsoft.Json/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接