2012-11-04 8 views
7
 var sample = new 
     { 
      Time = DateTime.Now, 
      Name = "Hello" 
     }; 
     Trace.TraceInformation("{0}", sample); 

Ausgänge alsAufschalten ToString() Implementierung von anonymen Objekten

ProcessInvocation86.exe Information: 0: {Time = 04.11.2012 22.07.52, Name = Hallo}

Ich möchte unterschiedliche Formatierung in meiner Anwendung. Gibt es eine Möglichkeit, die Implementierung von ToString() für anonyme Objekte in C# zu ändern? Vielleicht ein statisches Feld per AppDomain oder so?

+1

Wahrscheinlich nicht für anonyme Typen. Wenn Sie beginnen, von einer einfachen Datenstruktur in ein etwas reicheres Objekt zu wechseln, das Funktionen verfügbar macht (z. B. das Überschreiben einer Methode), müssen Sie einen expliziten Typ definieren. – David

+1

Ich habe es geschafft: 'var sample = new {Zeit = DateTime.Now, Name =" Hallo ", ToString = neuer Func (() => {return" xxx ";})}; Console.WriteLine (" {0} ", sample.ToString());'. Leider scheint es keine Möglichkeit zu geben, auf 'this' von ToString Func zuzugreifen, also kann es nur Konstanten oder globale Variablen zurückgeben - nutzlos, denke ich :( – Ondra

Antwort

8

Nein, Sie können dies nicht tun - ToString, Equals und GetHashCode haben Standard-Implementierung von Framework bereitgestellt. Um diese Funktionalität zu überschreiben, sollten Sie von Ihrem anonymen Typ erben, was unmöglich ist.

Verwenden Sie String.Format, um die gewünschte Ausgabe zu erhalten.

+3

Ich füge hinzu, wenn Sie diese Art von Funktionalität benötigen, dann sollten Sie a definieren echte Klasse und erweitern sie entsprechend. –

+0

@JonathonReinhart yep, schrieb gerade dieses Update! –

4

Soweit ich weiß, gibt es keine Möglichkeit, das Standardverhalten ToString zu überschreiben.
Könnte sich lohnen auf einige der Beiträge von Eric Lippert über anonyme Typen suchen: http://blogs.msdn.com/b/ericlippert/archive/tags/anonymous+types/

Wahrscheinlich am besten eine einfache Klasse für diesen Zweck zu erstellen:

z.B.

1

Ich weiß, einige Leute werden mich tatsächlich schlagen für eine solche Lösung und ich stimme zu, dass Sie es nicht in der Produktion verwenden sollten. Wenn Sie bestimmte Funktionen für einige Datenpakete haben, sollte dies auf jeden Fall in eine separate Klasse gehen. Aber für kleinere Probleme, können Sie ein wenig Reflexion wie folgt verwenden einige benutzerdefinierte Formatierer zu schreiben (ich wiederhole, ich bin nicht in der Produktion zu verwenden, was darauf hindeutet):

private string FormatProperties<T> (T obj) 
{ 
    string result = ""; 
    var type = typeof(T); 
    foreach (var prop in type.GetProperties()) 
    { 
     result += string.Format("{0}:{1}\r\n", prop.Name, prop.GetValue(obj)); 
    } 
    return result; 
} 

Dann wird der Anruf

var anon = new {Name = "Ilya", Surname = "Ivanov"}; 
Console.WriteLine (FormatProperties(anon)); 

Wird

Name:Ilya 
Surname:Ivanov 

in gedruckter führen und dann können Sie Arten für Leistungsvorteile zwischenzuspeichern und in andere Arten von Schwierigkeiten bekommen.

0

das ist nicht gerade ideal .. aber Sie könnten eine Erweiterungsmethode erstellen, die eine Funktion übernimmt, die die Formatierung übernimmt.

Das folgende Beispiel formatiert für LinqPad Beispiel

void Main() 
{ 
var sample = new 
     { 
      Time = DateTime.Now, 
      Name = "Hello", 
     }; 

    sample.ToAnonString(()=>sample.Name).Dump(); 

} 
public static class ovs{ 
     public static string ToAnonString(this object o,Func<string> exp){ 
     return exp(); 
     } 
    } 
Verwandte Themen