11
votes

Y a-t-il un moyen de remplacer automatiquement la totring () sur une classe?

Je trouve utile de remplacer la totring () sur de nombreuses classes simples DTO / POCO que j'écris pour montrer de bonnes informations lors de la navigation sur des instances dans le débogueur.

Voici un exemple: p>

  public class IdValue< T >
  {
    public IdValue( int id, T value )
    {
      Id = id;
      Value = value;
    }

    public int Id { get; private set; }
    public T Value { get; private set; }

    public override string ToString()
    {
      return string.Format( "Id: {0} Value: {1}", Id, Value );
    }
  }


0 commentaires

6 Réponses :


0
votes

Ce n'est pas une bonne considération de conception. Je vous conseillerais d'extraire des valeurs où vous devez leur enregistrer ou d'avoir une méthode d'assistance (vous pouvez utiliser des méthodes d'extension sur system.Object).


0 commentaires

16
votes

Vous pouvez remplacer la totring dans une classe de base puis utiliser la réflexion sur l'instance pour découvrir les propriétés publiques de la classe dérivée. Mais cela introduira probablement des problèmes de performance dans d'autres domaines de votre code. De plus, étant donné que la tostring est utilisée par beaucoup de choses (String.Format, reliure de données par défaut, etc.) Remplacer la touche de débogage des fins de débogage rendra vos cours moins utiles dans d'autres scénarios.

Au lieu de cela, vous voudrez peut-être utiliser l'attribut DebuggerDisplay pour contrôler la manière dont le débogueur affiche survolez des conseils et des informations sur la fenêtre de la montre etc. Je suis à peu près sûr que cela fonctionne si vous l'appliquez à une classe de base. Vous pouvez également créer des visualiseurs personnalisés, mais c'est plus impliqué. Consultez ce lien pour plus d'informations sur l'amélioration de l'expérience d'affichage du débogueur.

Améliorer le débogage


1 commentaires

Merci! Tout ce que je devais faire était d'ajouter cet attribut à la classe I à l'origine affichée et comportait la façon dont je voulais: [DebuggerDisplay ("ID: {id} valeur: {valeur}")]



0
votes

Voici une manière que cela puisse être fait dans une manière conviviale de débogueur xxx

l'attribut [conditionnel] est la clé de votre question.


1 commentaires

Le conditionnement conditionné est vraiment plus conçu lorsque vous exposez une méthode à un autre appelant dont la configuration de Build vous ne connaissez pas à l'avance. Dans ce cas, vous pourriez obtenir le même résultat sans l'ambiguïté du site d'appel à l'aide de #sif de débogage. Mais c'est un attribut très utile et peu connu!



0
votes

Écoutez les gens qui vous avertissent de la performance et / ou des considérations de conception. Vous liez étroitement un comportement en fonction d'un besoin assez limité, lorsque vous pourriez découpler vos besoins en utilisant une extension ou un décorateur.


0 commentaires

1
votes

Si cela ne vous dérange pas d'une dépendance externe, vous pouvez passer à un cadre qui aide à imprimer toutes les propriétés de vos objets comme EtatPrinter

Un exemple d'utilisation xxx


0 commentaires

1
votes

Vous pouvez utiliser JSON:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Script.Serialization;

namespace ConsoleApplication1
{
    public class IdValue<T>
    {
        public IdValue(int id, T value)
        {
            Id = id;
            Value = value;
        }

        public int Id { get; private set; }
        public T Value { get; private set; }

        public override string ToString()
        {
            return new JavaScriptSerializer().Serialize(this);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var idValue = new IdValue<string>(1, "Test");
            Console.WriteLine(idValue);
            Console.ReadKey();
        }
    }
}


0 commentaires