Кросс-языковой DebuggerDisplay для SqlDataReader - PullRequest
0 голосов
/ 10 апреля 2019

Я пытаюсь настроить подсказки отлаженных объектов. Для этого у меня есть библиотека, включающая атрибуты Assembly: DebuggerDisplay ( Можно ли применять атрибут DebuggerDisplay к типам, которым не принадлежит? ) в папке 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.

У меня был атрибут для DataRow, который использует ItemArray, поэтому я искал что-то похожее в SqlDataReader. Есть приватное поле _data ( SqlBuffer [] ). Проблема в том, что массив не содержит значений, но его элементы имеют свойство 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))>

Есть ли способ получить список значений с синтаксисом, общим для обоих языков?

...