10
votes

Remplacement dynamique de Tostring () en utilisant la réflexion

Je remplace généralement la méthode Tostring () pour émettre les noms de propriété et les valeurs qui leur sont associées. Je suis tombé un peu fatigué d'écrire ceux-ci à la main, alors je cherche une solution dynamique.

Main: P>

Prop1: blah1
Prop2: blah2


2 commentaires

Vous devez utiliser la méthode getvalue .


Vous ne devez pas utiliser Tostring pour renvoyer toutes les valeurs de propriété en général. Au lieu de cela, vous pouvez fournir une méthode getpropertyinfo qui le fait si vous voulez.


6 Réponses :


18
votes

Ceci fonctionne pour moi:

var list = new List<string>();
// (filling list ommitted)
list.ToStringExtension();
// output:
// Capacity: 16
// Count: 11
// Item: Indexed Property cannot be used


2 commentaires

Qu'en est-il de la perforation en utilisant la réflexion? Qu'en est-il de la mise en œuvre de Hanselman Hanselman.com/blog/... ?


Travailler aussi pour des propriétés nullables Public int? ProP2 {Obtenir; ensemble; } ou DateTime public? Prop3 {obtenir; ensemble; } ?



5
votes

Voici une extension qui signalera les types standard tels que String, Int et DateTime, mais signalera également des listes de chaînes (indiquées ci-dessous dans Points d'accès que la réponse ci-dessus n'a pas pu gérer). Notez que la sortie est alignée sur: xxx

ci-dessous est l'extension qui prend n'importe quel type aussi longtemps que sa classe. Il reflète ensuite les propriétés publiques et privées et s'ils ne sont pas nuls les signalements. xxx

utilisation

myInstance.reportulProperties ()

Notez que cela est basé sur mon article de blog C #: Tostring pour signaler tout Propriétés même les privées via une réflexion qui fournit une explication plus robuste de ce qui se passe.


1 commentaires

Travailler aussi pour des propriétés nullables Public int? ProP2 {Obtenir; ensemble; } ou DateTime public? Prop3 {obtenir; ensemble; } ?



0
votes

C'est ce que j'ai trouvé, cela fonctionne avec la plupart des types compliqués (y compris la liste): x

utilisation: xxx


0 commentaires

0
votes

Je l'ai rencontré moi-même où je cherche une option pour sérialiser dans quelque chose de lisible. S'il n'y a pas de propriétés en lecture seule, la sérialisation XML peut donner une chaîne lisible. Toutefois, s'il existe uniquement des propriétés / des champs en lecture, la sérialisation XML n'est pas une option.

    public static string ToString(object serializeable)
    {
        var type = serializeable.GetType();
        try
        {
            var sw = new StringWriter();
            new XmlSerializer(type).Serialize(sw, serializeable);
            return sw.ToString();
        }
        catch
        {
            return type.FullName;
        }
    }


0 commentaires

0
votes

Alors j'ai écrit une méthode d'extension qui appelle une bibliothèque qui a déjà compris tous les Voodoo.

"Remplacer la chaîne ToString ()" vs (My) "TostringDump" .... P> P> P> P> P> Avant d'afficher le code, la raison pour laquelle j'aime la méthode d'extension (TostringDump dans ce cas) .. Meilleur, c'est que je n'ai pas à énigager mes objets Poco / Dto avec des références ObjectDummp. Je crois que les pocos et les DTO devraient être «très très propres» et même isolé dans leur propre assemblée. De cette façon, ces objets POCO / DTO sont facilement partagés. P>

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFrameworks>netstandard2.0</TargetFrameworks>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="ObjectDumper.NET" Version="2.5.20033.1" />
  </ItemGroup>

</Project>


0 commentaires

0
votes

J'utiliserais JSON, Serializer fera tout le travail difficile pour vous:

    public static class ObjectExtensions
    {
        public static string ToStringEx(this object obj)
        {
            return JsonSerializer.Serialize(obj, new JsonSerializerOptions { WriteIndented = true });
        }
    }


0 commentaires