在 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()]
。
我有 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()]
。