Межъязыковой индекс DataRow в DebuggerDisplay - PullRequest
0 голосов
/ 17 октября 2018

Я пытаюсь настроить подсказки отлаженных объектов.Для этого у меня есть библиотека, включающая атрибуты Assembly: DebuggerDisplay ( Можно ли применять атрибут DebuggerDisplay к типам, которым не принадлежит? ) в папке Visualizer ( Как: установить визуализатор ).

Я хотел бы видеть индекс DataRow, поэтому у меня есть в vb.net

<Assembly: DebuggerDisplay("Idx = {Table.Rows.IndexOf(Me)}", Target:=GetType(DataRow))> 

или в C #

[assembly: DebuggerDisplay(@"Idx = {Table.Rows.IndexOf(this)}", Target = typeof(DataRow))] 

Проблема в том, что выражение вычисляетсяво время отладки и самоссылки объекта (Me x this) различны в обоих языках.Поэтому я получаю

CS0103  The name 'Me' does not exist in the current context

во всплывающей подсказке при отладке кода C #.

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

1 Ответ

0 голосов
/ 17 октября 2018

Исходный код Rows.IndexOf

    public Int32 IndexOf(DataRow row) {
        if ((null == row) || (row.Table != this.table) || ((0 == row.RBTreeNodeId) && (row.RowState == DataRowState.Detached))) //Webdata 102857
            return -1;
        return list.IndexOf(row.RBTreeNodeId, row);
    }

показывает, что он возвращает результат list.IndexOf

    public int IndexOf (int nodeId, K item)
    {
        int index = -1;
        // BIG ASSUMPTION: There is not satellite tree, this is INDEX_ONLY.
        if (nodeId != NIL)
        {
            if ( (Object) Key(nodeId) == (Object)item) {
                return GetIndexByNode(nodeId);
            }
            if ( (index=IndexOf(Left(nodeId), item)) != -1) {
                return index;
            }
            if ( (index=IndexOf(Right(nodeId), item)) != -1) {
                return index;
            }
        }

        return index;
    }

Если мы предположим, что допустимо вызвать GetIndexByNode напрямую и передать значение DataRow.RBTreeNodeId напрямую, то должно работать следующее:

[assembly: DebuggerDisplay(@"Index = {Table.Rows.list.GetIndexByNode(RBTreeNodeId)}", Target = typeof(System.Data.DataRow))]
...