在 VisualStudio 调试模式下复制对象值

在 Visual Studio 调试模式下,可以将鼠标悬停在变量上以显示它们的值,然后右键单击“复制”、“复制表达式”或“复制值”。

如果变量是一个对象而不仅仅是一个基本类型,那么就会有一个 + 符号来展开和探索该对象。有办法把这些都复制到剪贴板上吗?

104356 次浏览

您可以为该对象添加一个 watch,并在 watch 窗口中展开并选择要复制的所有内容,然后复制它。

通过使用 属性来装饰您的类和方法,您可以在使用 调试器显示属性进行调试期间从对象显示中获得一个特定的值。

[DebuggerDisplay("Person - {Name} is {Age} years old")]
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}

在即时窗口中,键入

?name_of_variable

这将打印出 一切,您可以手动复制到任何您想要的地方,或使用即时窗口的日志功能自动将其写入文件。

更新 : 我假设您问的是如何复制/粘贴嵌套结构的值,以便您可以搜索它的文本,或者您可以保存在一边,然后比较对象的状态与它。如果我是对的,您可能需要查看我创建的 Visual Studio 的商业扩展,称为 OzCode,它使您通过“ Search”和“ Compare”特性更容易地完成这些工作。

更新2 为了回答@ppumkin 的问题,我们的 新经济伙伴计划有一个新的 Export 特性,允许用户将变量值导出到 Json、 XML、 Excel 或 C # 代码。

完整披露: 我是我在这里描述的工具的共同创造者。

您可以在即时窗口中运行以下代码,它会将对象的序列化 XML 表示形式导出到 XML 文件:

(new System.Xml.Serialization.XmlSerializer(obj.GetType())).Serialize(new System.IO.StreamWriter(@"c:\temp\text.xml"), obj)

资料来源: VisualStudio 如何从调试器序列化对象

Google 让我想到了这个8年前的问题,我最终使用 翻斗车实现了一些非常类似于复制粘贴调试器数据的功能。只是一阵微风。

我知道这个问题是专门针对来自 调试器的信息提出的,但 ObjectDumper 提供的信息基本上是相同的。我假设那些谷歌这个问题的人和我一样,只是需要调试目的的数据,并不关心它是否从技术上来自调试器或不。

我总是用:

string myJsonString = JsonConvert.SerializeObject(<some object>);

然后我复制字符串值,不幸的是它也复制了反斜杠。

要消除反弹,请点击这里: Https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_replace

然后在 <p id="demo">Visit Microsoft!</p>元素中用您复制的文本替换文本。 然后将 var res = str.replace("Microsoft", "W3Schools");线替换为

var res = str.replace(/\\/g, '')

运行这些新的更改,但是不要忘记点击右边的“尝试”按钮。

现在您应该有了 json 格式的对象的所有文本,您可以将其放入一个 json 格式化程序(如 http://jsonformatter.org)中,或者创建一个 POCO,您现在可以使用 http://json2csharp.com/

我知道我有点晚了,但是如果您更喜欢使用 JSON 输出,那么我编写了一个用于序列化对象的 JSON 实现。使用牛顿软件。Json 的推荐信。

private static void WriteDebugJSON (dynamic obj, string filePath)
{
using (StreamWriter d = new StreamWriter(filePath))
{
d.Write(JsonConvert.SerializeObject(obj));
}
}

如果你有一个列表,你想找到一个特定的变量: 在即时窗口中,键入

 myList.Any(s => s.ID == 5062);

如果这个结果为真

var myDebugVar = myList.FirstOrDefault(s => s.ID == 5062);
?myDebugVar

我刚刚右键点击了变量,选择了 AddWatch,这是一个由所有值组成的监视窗口。我选择了所有,并粘贴到一个文本文本编辑器,这一切。

https://stackoverflow.com/a/23362097/2680660最受欢迎的答案是:

如果幸运的话,你已经在你的应用程序域名中有了 Json.Net 案例弹出到你的即时窗口:

Newtonsoft.Json.JsonConvert.SerializeObject(someVariable)

编辑: 对于.NET Core 3.0,以下内容同样适用:

System.Text.Json.JsonSerializer.Serialize(someVariable)

有用的提示在这里,我将添加我的偏好,当我下一次结束在这里再次问这个问题。 如果你不介意添加一个不需要输出文件的扩展或者类似的,有一个十六进制视觉工作室的可视化扩展,作者是姆拉登 · 米哈伊洛维奇,他从2015年就开始做版本了。 通过局部变量窗口中常见的放大镜视图对象提供了数组的良好显示。 Https://marketplace.visualstudio.com/items?itemname=mika76.hexvisualizer2019 是2019年版本。

如果处于调试模式,可以通过在调试终端中编写 copy ()来复制任何变量。

这可以处理嵌套对象,还可以删除截断并复制完整值。

提示: 您可以右键单击一个变量,然后单击 Copy as Expression,然后将其粘贴到 copy-function 中。

Objectdumper.net

这是一个令人敬畏的方式!

  1. 单元测试可能需要这些数据,所以创建一个 Sandbox.cs临时测试或者创建一个 Console App。
  2. 确保获取 NuGet 包 翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳 objectdumper.net,而不是 ObjectDumper。
  3. 运行此测试(或控制台应用程序)
  4. 查看测试输出或文本文件以获取 C # 初始化器代码!

密码:

[TestClass]
public class Sandbox
{
[TestMethod]
public void GetInitializerCode()
{
var db = TestServices.GetDbContext();
var list = db.MyObjects.ToList();
var literal = ObjectDumper.Dump(list, new DumpOptions
{
DumpStyle = DumpStyle.CSharp,
IndentSize = 4
});
Console.WriteLine(literal); // Some test runners will truncate this, so use the file in that case.
File.WriteAllText(@"C:\temp\dump.txt", literal);
}
}

我曾经使用对象导出器,但它已经使用了5年,在 VisualStudio 中不再受支持。VisualStudio 扩展似乎来了又走,但是让我们希望这个 NuGet 包能够留下来!(在撰写本文时,它也得到了积极的维护。)

File.WriteAllText (“ b.json”,page. DebugInfo () . ToJson ()) 工程伟大,以避免处理字符串调试格式”的报价。

正如@OmerRaviv 所说,你可以进入 Debug → Windows →立即执行 会打字:

myVariable

(正如@Bombek 在评论中指出的,你不需要问号)尽管有些人发现这个限制是100行。

我发现一个更好的方法是右键单击变量→ Add Watch,然后按 +来展开任何我想展开的内容,然后使用 @ GeneWhitaker 的解决方案,也就是 Ctrl+A,然后复制 Ctrl+C并粘贴到文本编辑器 Ctrl+V中。