#c# #visual-studio-2010 #visualizer
#c# #visual-studio-2010 #визуализатор
Вопрос:
Я пытаюсь создать визуализатор отладки C #, который может выполнять визуализацию для всех объектов. Кажется, я не могу получить атрибут assembly (над пространством имен), чтобы привязать этот визуализатор к System.Объект, подобный тому, который я смог сделать с другими объектами в системе. Я долго искал, но не нашел никаких примеров / обсуждений о создании визуализатора для всех объектов. Вот код, который я пытаюсь заставить работать, он работает достаточно хорошо при привязке к String или Int32, но не к Object или object .
[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. Зачем вам нужно знать, в какой сборке system.object находится? Я не вижу, где вы явно ссылаетесь на сборку.
2. Извините, я должен был использовать атрибут, а не ссылку, редактирование.
3. Если вам нужно сравнить 2 объекта, если они равны, просто используйте окно просмотра отладчика, введите в него имена переменных и выполните команду «Создать идентификатор объекта» из всплывающего меню для каждой из переменных. Если у них одинаковый идентификатор объекта, это означает, что они указывают на одну и ту же ссылку на объект.
4. Поправьте меня, если я ошибаюсь, но не должно ли
Target
свойствоDebuggerVisualizer
указывать на сериализуемый тип данных?
Ответ №1:
Я не знаю, что не так с вашим кодом. однако, @Bismark, целевой объект не обязательно должен иметь возможность сериализации, поскольку вы можете использовать свой собственный VisualizerObjectSource
для его сериализации
Я предлагаю вам сериализовать .GetType().AsseblyQualifierName
его вместе с ним, это позволит вам определить, какой объект содержит поток, поэтому при десериализации вы знаете, что ваш объект фактически является экземпляром класса x
, я использовал этот метод в одном из моих собственных визуализаторов, так как иногда вы можете сериализовать подтип потока.класс во время десериализации вы понятия не имеете, с каким временем работаете.