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