Создание визуализатора C# VS2010, который работает со всеми объектами

Я пытаюсь создать визуализатор отладки 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 ответ

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

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

Другие вопросы по тегам