11 Stimmen

Dynamische Überschreibung von ToString() mit Reflection

Im Allgemeinen überschreibe ich die Methode ToString(), um die Eigenschaftsnamen und die ihnen zugeordneten Werte auszugeben. Ich habe ein bisschen müde, diese von Hand zu schreiben, so dass ich für eine dynamische Lösung suchen.

Haupt:

TestingClass tc = new TestingClass()
{
    Prop1 = "blah1",
    Prop2 = "blah2"
};
Console.WriteLine(tc.ToString());
Console.ReadLine();

TestingClass:

public class TestingClass
{
    public string Prop1 { get; set; }//properties
    public string Prop2 { get; set; }
    public void Method1(string a) { }//method
    public TestingClass() { }//const
    public override string ToString()
    {
        StringBuilder sb = new StringBuilder();
        foreach (Type type in System.Reflection.Assembly.GetExecutingAssembly().GetTypes())
        {
            foreach (System.Reflection.PropertyInfo property in type.GetProperties())
            {
                sb.Append(property.Name);
                sb.Append(": ");
                sb.Append(this.GetType().GetProperty(property.Name).Name);
                sb.Append(System.Environment.NewLine);
            }
        }
        return sb.ToString();
    }
}

Diese gibt derzeit aus:

Prop1: System.String Prop1
Prop2: System.String Prop2

Gewünschter Output:

Prop1: blah1
Prop2: blah2

Ich bin offen für andere Lösungen, es muss nicht unbedingt eine Reflexion sein, es muss nur das gewünschte Ergebnis liefern.

0voto

granadaCoder Punkte 23364

Also habe ich eine Erweiterungsmethode geschrieben, die eine Bibliothek aufruft, die das ganze Voodoo bereits herausgefunden hat.

"override string ToString()" vs (my) "ToStringDump"....

Bevor ich den Code zeige, möchte ich darauf hinweisen, dass mir die Erweiterungsmethode (in diesem Fall ToStringDump) besser gefällt, weil ich meine POCO/DTO-Objekte nicht mit ObjectDump-Referenzen durcheinanderbringen muss. Ich bin der Meinung, dass POCOs und DTOs "sehr, sehr sauber" sein sollten und sogar in einer eigenen Assembly isoliert werden sollten. Auf diese Weise lassen sich diese POCO/DTO-Objekte leicht gemeinsam nutzen.

public static class ObjectDumpAdapter
{
    public static string ToStringDump(this object obj)
    {
        string returnValue = ObjectDumper.Dump(obj);
        return returnValue;
    }
}

Mein dotnet core csproj

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

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

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

</Project>

Nuget-Link:

https://www.nuget.org/packages/ObjectDumper.NET/


Zitat:

ObjectDumper ist ein Dienstprogramm zur Serialisierung von C#-Objekten in Strings für Debugging- und Protokollierungszwecke serialisiert.

(aus https://nugetmusthaves.com/Package/ObjectDumper.NET )


GitHub-Link:

https://github.com/thomasgalliker/ObjectDumper

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X