Создание визуализатора C # VS2010, который работает со всеми объектами - PullRequest
4 голосов
/ 07 октября 2011

Я пытаюсь создать визуализатор отладки C #, который может выполнять визуализацию для всех объектов. Я не могу получить атрибут сборки (над пространством имен), чтобы связать этот визуализатор с System.Object, как я мог с другими объектами в системе. Я долго искал, но не нашел ни одного примера / обсуждения о создании визуализатора для всех объектов. Вот код, который я пытаюсь получить, он работает достаточно хорошо, когда привязан к String или Int32, но не к объекту или объекту.

[assembly: System.Diagnostics.DebuggerVisualizer(
typeof(Visualizers.ObjectVisualizer), typeof(Visualizers.RawObjectScource),
Target = typeof(object), Description = "Object Visualizer")]
namespace Visualizers
{
public class ObjectVisualizer : DialogDebuggerVisualizer
{
    override protected void Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider)
    {
        Console.Out.WriteLine("InShow");
        MessageBox.Show(objectProvider.GetObject().ToString());
    }
}

// handle any object, doesn't require that it's Serializable
public class RawObjectScource : VisualizerObjectSource
{
    public override void GetData(object target, Stream outgoingData)
    {
        if (target != null)
        {
            BinaryFormatter formatter = new BinaryFormatter();
            formatter.Serialize(outgoingData, target.ToString());
        }
    }
}
}

Будучи бывшим Java-программистом, который использовал IntelliJ, я привык видеть в режиме отладки, на какой адрес кучи указывает конкретная ссылка. Это позволяет сразу увидеть, равны ли два объекта. Кроме того, есть несколько других вещей, которые было бы полезно узнать, но они могут быть немного длинными для объяснения. Если я смогу заставить его работать, я опубликую окончательный код.

Так кто-нибудь знает, как заставить визуализатор быть активным для всех объектов?

1 Ответ

0 голосов
/ 22 октября 2011

Я не знаю, что не так с вашим кодом. однако @Bismark, цель не должна быть в состоянии сериализироваться, так как вы можете использовать свой собственный VisualizerObjectSource для его идентификации

Я предлагаю вам разделить .GetType().AsseblyQualifierName вдоль него, это позволит вам определить, к какому объекту относится поток, поэтому при десериализации вы знаете, что ваш объект на самом деле является экземпляром класса x, я использовал это Я использую один из моих собственных визуализаторов, так как иногда вы можете сериализовать подтип класса, в то время как при десериализации вы не представляете, во сколько вы работаете.

...