Как заставить [DebuggerDisplay] уважать наследованные классы или по крайней мере работать с наборами?

Как WMR упомянула, org.apache.commons.io.IOUtils от Apache имеет метод, названный copy(InputStream,OutputStream) , который делает точно, что Вы ищете.

Так, Вы имеете:

InputStream in;
OutputStream out;
IOUtils.copy(in,out);
in.close();
out.close();

... в Вашем коде.

там причина, которой Вы избегаете IOUtils?

14
задан BIBD 12 July 2009 в 19:14
поделиться

2 ответа

Вы можете получить нужный эффект, используя атрибут DebuggerTypeProxy . Вам необходимо создать класс, чтобы сделать отладочную «визуализацию» вашего унаследованного списка:

internal sealed class MagicBeanListDebugView
{
    private List<MagicBean> list;

    public MagicBeanListDebugView(List<MagicBean> list)
    {
        this.list = list;
    }

    [DebuggerBrowsable(DebuggerBrowsableState.RootHidden)]
    public MagicBean[] Items{get {return list.ToArray();}}
}

Затем вы можете объявить этот класс, который будет использоваться отладчиком для отображения вашего класса, вместе с атрибутом DebuggerDisplay :

[DebuggerDisplay("Count = {Count}")]
[DebuggerTypeProxy(typeof(MagicBeanListDebugView))]
public class MagicBeanList : List<MagicBean>
{}

Это даст вам сообщение «Count = 3» при наведении курсора на экземпляр унаследованного списка в Visual Studio и представление элементов в списке при развертывании корневого узла без необходимости углубляться в базовые свойства.

Использование ToString () для получения отладочных данных не является хорошим подходом, если, конечно, вы уже не переопределяете ToString () для использования в другом месте , и в этом случае вы можете им воспользоваться.

11
ответ дан 1 December 2019 в 14:22
поделиться

Посмотрев статью « Использование атрибута DebuggerDisplay » в MSDN, они предложили вам переопределить функцию ToString () вашего класса в качестве альтернативного варианта, а не использовать Атрибут DebuggerDisplay. Переопределение метода ToString () также не скроет ваши bean-компоненты.

Если объект C # имеет переопределенный ToString (), отладчик вызовет переопределить и вместо этого показать результат стандарта {}. Таким образом, если вы переопределили ToString (), вы делаете не обязательно использовать DebuggerDisplay. Если вы используете оба, DebuggerDisplay атрибут имеет приоритет над Переопределение ToString ().

Можете ли вы переопределить метод ToString () в своем классе или используете его для других целей?

Я не знаю, рассматривали ли вы это уже или нет, но я думал, что предлагаю это на случай, если это поможет. : -)

Для полноты, чтобы любой другой мог быстро его смоделировать; вот краткий пример, который я сделал:

namespace StackOverflow
{
    //broken BeanPouch class that uses the DebuggerDisplay attribute
    [System.Diagnostics.DebuggerDisplay("Count = {Count}")]
    class BrokenBeanPouch : List<MagicBean>
    { }

    //working BeanPouch class that overrides ToString
    class WorkingBeanPouch : List<MagicBean>
    {
        public override string ToString()
        {
            return string.Format("Count = {0}", this.Count);
        }
    }

    class Program
    {
        static WorkingBeanPouch myWorkingBeans = new WorkingBeanPouch()
        {
            new MagicBean() { Value = 4.99m }, new MagicBean() { Value = 5.99m }, new MagicBean() { Value = 3.99m }
        };

        static BrokenBeanPouch myBrokenBeans = new BrokenBeanPouch()
        {
            new MagicBean() { Value = 4.99m }, new MagicBean() { Value = 5.99m }, new MagicBean() { Value = 3.99m }
        };

        static void Main(string[] args)
        {
            //break here so we can watch the beans in the watch window
            System.Diagnostics.Debugger.Break();
        }
    }

    class MagicBean
    {
        public decimal Value { get; set; }
    }    
}
3
ответ дан 1 December 2019 в 14:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: