在 C# 中创建托管可视化工具的最简单方法是什么?

What's the easiest way to create a managed visualiser in C#?

我有 C++ 背景,最近我开始使用 C#。

我写了以下代码(在 Visual Studio 中):

var list_Loads = database.GetData<Load>().ToList();
var test_list = list_Loads.Where(o => (o.Name.Substring(0, 3) == "123")).ToList();

当我 运行 程序并将鼠标移到两个列表上时,首先我得到计数​​,这非常有用,但是当我要求条目时,我得到的是:

0 : namespace.Load
1 : namespace.Load
2 : namespace.Load
...

用处不大,如你所想:-)

所以我的问题是:如何显示这些对象的 Name 属性?

我想:没问题。我有原生可视化工具的背景,所以将其转化为有用的信息应该很容易,但它来了:
为了改变这些对象的表示方式,第一个提议是在源代码中 class 的定义中添加一个 [DebuggerDisplay] “标签”。
然而,由于那些 classes 是我刚刚提到的框架的一部分,我无法访问源代码,因此我无法修改它。

然后我找到了另一个解决方案,归结为:“编写一个完整的 C# 项目,调试、测试并安装它,它可能会工作”(参见 documentation on "Custom visualisers of data" on the Microsoft website)。
我差点被咖啡呛到:写一个完整的项目,只是为了改变一个对象的视图??? (而在 C++ 中,您只需创建一个简单的 .natvis 文件,提及 class 名称和一些配置,启动 .nvload 即可。

有没有人知道一种简单的方法来改变 C# 对象的外观,而无需承担创建整个 C# 项目的全部负担?

顺便说一下,当我尝试在 Visual Studio 中立即加载 natvis 文件时 window,这是我得到的:

.nvload "C:\Temp_Folder\test.natvis"
error CS1525: Invalid expression term '.'

我做错了什么?

提前致谢

OP(我的重点):

In order to alter the way that those objects are represented, there is the first proposal to add a [DebuggerDisplay] "tag" to the definition of that class in source code. However, as those classes are part of a framework I'm just referring to, I don't have access to the source code and hence I can't modify this.

Does anybody know a simple way to alter the appearance of C# object, without needing to pass through the whole burden of creating an entire C# project?

如果您只想在类型上指定 [DebuggerDisplay],则不必访问源代码。您可以使用 [assembly:DebuggerDisplay()] 并控制类型在调试器中的显示方式。唯一的缺点是 [assembly:DebuggerDisplay()] 自然只会影响您的鼠标悬停在其代码上的 current 程序集。如果您希望在您拥有的其他程序集中使用自定义显示,则必须重复 [assembly:DebuggerDisplay()] 定义。

这是一个简单的 before-and-after 示例 DateTime。我选择 DateTime 因为我们通常无法访问源代码并且它有一些有趣的属性:

 var items = new List<DateTime>
 {
     DateTime.Now.AddDays(-2),
     DateTime.Now.AddDays(-1),
     DateTime.Now
 };

...在我的机器上默认为:

可能是我比较挑剔,只想看看:

  • 星期几
  • 一年中的第几天

...我可以通过以下方式做到这一点:

using System.Diagnostics;

[assembly: DebuggerDisplay("{DayOfWeek} {DayOfYear}", Target = typeof(DateTime))]

...结果是:

示例:

namespace DebuggerDisplayTests
{
    public class DebuggerDisplayTests
    {
        public DebuggerDisplayTests()
        {
            var items = new List<DateTime>
            {
                DateTime.Now.AddDays(-2),
                DateTime.Now.AddDays(-1),
                DateTime.Now
            };
        }
    }
    .
    .
    .
}

覆盖

[assembly:DebuggerDisplay()] 也可以用作在第 3 方类型上 覆盖 pre-existing [DebuggerDisplay] 的手段。不喜欢他们选择的款式?该类型是否显示太多信息?将其更改为 [assembly:DebuggerDisplay()]