Dynamisches überschreiben von ToString() mit der Spiegelung
Ich in der Regel überschreiben Sie die ToString () - Methode, um die Ausgabe der Namen der Eigenschaft und die Werte zu Ihnen. Ich habe ein wenig müde zu schreiben, diese mit der hand so ich bin auf der Suche nach einer dynamischen Lösung.
Main:
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 derzeit Ausgänge:
Prop1: System.String Prop1
Prop2: System.String Prop2
Gewünschte Ausgabe:
Prop1: blah1
Prop2: blah2
Ich bin offen für andere Lösungen, es keine Reflexion, es geht nur um die Erstellung der gewünschten Ausgabe.
- Sie müssen verwenden Sie die
GetValue
Methode. - Sie sollten nicht
ToString
um alle property-Werte im Allgemeinen. Stattdessen können Sie eine MethodeGetPropertyInfo
das tut es, wenn Sie wollen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese funktioniert bei mir:
Zur Verfügung zu stellen, überall wo Sie können erstellen eine Erweiterung.
Es ist nicht möglich, überschreiben von Methoden in einer Erweiterung, aber noch sollte es Ihr Leben zu vereinfachen.
Können Sie dann rufen
ToStringExtension()
auf jedes Objekt.Nachteil ist, es funktioniert nicht perfekt, für Listen usw., Beispiel:
Hier ist eine Erweiterung, die den Bericht an den standard Typen wie string, int und Datetime werden, sondern auch der Bericht von string-Listen (siehe unten in
AccessPoints
welche die obige Antwort konnte nicht mit). Beachten Sie, dass die Ausgabe ausgerichtet ist wie:Unten ist die Verlängerung dauert in jedem Typ so lange seine Klasse. Dann reflektiert der öffentlichen und privaten Eigenschaften und, wenn Sie nicht null berichtet Sie.
Nutzung
myInstance.ReportAllProperties()
Beachten Sie, dass dies ist, basierend auf meinen blog-Artikel C#: ToString über sämtliche Eigenschaften, Auch Privat Per Reflection bietet eine robuste Erklärung, was Los ist.
Dies ist, was ich gefunden habe, das funktioniert mit den meisten compicated-Typen (einschließlich der Liste):
Verwendung:
Lief ich in diese mich wo ich bin auf der Suche nach einer Möglichkeit zur Serialisierung in etwas lesbares. Wenn es keine nur-Lesen-Eigenschaften die xml-Serialisierung kann einen lesbaren string. Falls es jedoch nur-Lesen-Eigenschaften /Feldern xml-Serialisierung ist keine option.