【问题标题】:Immediate Window output programmatically以编程方式立即输出窗口
【发布时间】:2013-05-29 08:57:10
【问题描述】:

我有一个应用程序正在实现它自己的 C# 控制台(通过 Roslyn 的脚本引擎)。我已经获得了执行语句的代码并获得了可能的返回值,现在我想向控制台输出一个“不错”的字符串。调用“ToString()”的简单方法通常会产生非常难以理解的输出。

对我来说最好的解决方案是拥有与 Visual Studio 的“立即窗口”使用的相同类型的检查输出。

例如,如果我的语句计算结果为新字符串 []{“asd”},那么只需调用 ToString() 即可

System.String[]

我希望获得与即时窗口等效的输出 - 如下所示:

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

那么有谁知道如何调用即时窗口使用的相同转换?

【问题讨论】:

  • 我最接近实现这一目标的是使用herehere 所述的“对象转储器”
  • 谢谢,很有趣。我将把这个问题稍微开放一下,希望找到对实际即时窗口转换的 API 访问(因为我的用户也将使用 Visual Studio,所以这确实是最好和“最熟悉”的输出),但是这些链接肯定包含“人类可读转储”的好例子。

标签: c# visual-studio visual-studio-debugging immediate-window


【解决方案1】:

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

.ToString()

[0].ToString()

看看这是否会给你预期的结果。

【讨论】:

  • 使用字符串数组只是一个简单的例子,展示了即时窗口与 ToString() 的标准实现的良好输出。我想到的代码应该适用于各种对象。
  • 请举一个实际的例子 - 你调用 .ToString() 反对什么样的对象?它是您自己定义的类吗?在这种情况下,您必须覆盖该类中的 ToString() 方法并返回所需的文本。
  • 我不能给出一个实际的例子,因为它是一个通用的控制台,应该适合所有类型的对象(或至少“大多数”)。任何具体的例子(如上面的 string[])都会分散 generic 显示未知对象的问题。我也无法在目标对象上实现任何方法,因为我不控制该类(并且在我编写控制台代码时该类可能甚至都不存在)。当然,我可以使用标准类型的反射和测试编写自己的显示代码,但我的问题是关于我可以重用的内置方法。
  • 在这种情况下,它是正确的。您可能会包括一些一般性考虑因素,例如显示数组的不同元素(如果是这样的话,我的回答会告诉您如何),但除此之外 .ToString() 显示的内容取决于编写您正在检查的对象的人,并且你不应该覆盖他在调用 ToString() 时对象应该返回什么的决定。
【解决方案2】:

除了以前的 cmets/answers,您还可以使用任何类型的序列化程序来输出人类可读的值。我为此使用了 Json.NET:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 2014-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 1970-01-01
    相关资源
    最近更新 更多