跨语言DebuggerDisplay for SqlDataReader

时间:2019-04-10 12:52:20

标签: c# vb.net visual-studio visual-studio-2017 debuggerdisplay

我正在尝试自定义调试对象的工具提示。为此,我在Visualizers文件夹(Can the DebuggerDisplay attribute be applied to types one doesn't own?)中拥有一个包含Assembly: DebuggerDisplay属性(How to: Install a Visualizer)的库。

我想查看SqlDataReader当前正在访问的所有值。 因此,我有一个属性,该属性显示用分号分隔的值列表。

<Assembly: DebuggerDisplay("{String.Join(Convert.ToChar(59).ToString(),System.Linq.Enumerable.Select(System.Linq.Enumerable.Range(0, FieldCount()), AddressOf GetValue)),nq}", Target:=GetType(SqlClient.SqlDataReader))>

或在c#

[assembly: DebuggerDisplay(@"{String.Join(Convert.ToChar(59).ToString(),System.Linq.Enumerable.Select(System.Linq.Enumerable.Range(0, FieldCount()), GetValue)),nq}", Target = typeof(DataRow))] 

问题是,该表达式是在调试时求值的,并且c#没有(需要)运算符AddressOf

我有一个使用ItemArray的DataRow属性,所以我在SqlDataReader中寻找了类似的东西。有一个专用字段_dataSqlBuffer[])。问题在于数组不包含值,但其项具有属性Value。另外,仅当已经访问了值时才填充数组。

注释

  • 扩展方法不能在DebuggerDisplay中使用。
  • LINQ语法不能在DebuggerDisplay
  • 中使用
  • 当多于五个列时,该属性有时会导致冻结和Visual Studio重新启动。真正的属性是
<Assembly: DebuggerDisplay("{String.Join(Convert.ToChar(59).ToString(),System.Linq.Enumerable.Select(System.Linq.Enumerable.Range(0, if(FieldCount()>5,5,FieldCount())), AddressOf GetValue)),nq}{if(FieldCount()>5,Convert.ToChar(59).ToString() + Convert.ToChar(8230).ToString() , String.Empty),nq}", Target:=GetType(SqlClient.SqlDataReader))>

是否可以通过两种语言通用的语法获取值列表?

0 个答案:

没有答案