DebuggerTypeProxy - Exibindo estados complexos no depurador

Imagem de capa DebuggerTypeProxy - Exibindo estados complexos no depurador

DebuggerTypeProxy - Exibindo estados complexos no depurador

Vamos começar com um atributo bem conhecido: DebuggerDisplay: DebuggerDisplay controla como um objeto é exibido na visualização da variável do depurador.

Aqui um pequeno exemplo:

[DebuggerDisplay("{Name}'s Father: {Father.Name}")]
public  class  Person
{
    public DateTime Birthday { get; set; }
    
    public  string Name { get; set; }
    
    public Person Father { get; set; }
    
    public Person Mother { get; set; }
}

Se depurarmos nosso aplicativo e passarmos o mouse sobre um objeto Person, obteremos o seguinte:

O DebuggerTypeProxy permite que você escolha um proxy para o seu tipo. Isso significa que mostraremos o proxy em vez do objeto observado no momento. Vamos ver isso em ação:

public  class  PersonDebugView
{
   private  string hidden = "I am not visible";
   private Person _person;
   
   public  PersonDebugView(Person person)
   {
      _person = person;
   }
   
   public  string Parents => $"Father: {_person.Father.Name} / Mother: {_person.Mother.Name}";
   
   public  int Age => (DateTime.Now.Year - _person.Birthday.Year);
}

Nosso proxy usa a Pessoa como um argumento construtor. Ele tem duas propriedades e uma string privada. Isso é tudo. Vamos ver o que acontece quando anexamos o depurador:

Na visualização de depuração podemos ver apenas as propriedades do nosso proxy! E isso é toda a magia. Você pode usar os dois atributos juntos, conforme mostrado na imagem. Para esclarecer aqui como ambas as partes estão trabalhando juntas:

Se você quiser brincar sozinho, eu hospedei o código no github como essência.