Quale interfaccia o metodo dovrebbe implementare la mia classe per stampare ciò che voglio in Console.WriteLine?
-
06-07-2019 - |
Domanda
Ho un oggetto di classe F. Voglio produrre il contenuto dell'oggetto usando Console.WriteLine per aggiornamenti di stato rapidi e sporchi come questo:
Console.WriteLine (objectF);
Questo stampa solo il nome della classe sulla console:
F
Voglio sovraccaricarlo in qualche modo in modo da poter invece stampare alcune informazioni utili sull'oggetto e le sue proprietà.
Ho già una soluzione alternativa: sovraccaricare il metodo ToString nella mia classe e quindi chiamare: Console.WriteLine (objectF.ToString ());
Ma preferirei avere la sintassi più semplice. Qualche idea?
Soluzione
Console.WriteLine (objectF)
Dovrebbe funzionare, se hai sovraccaricato ToString
. Quando il framework deve convertire un oggetto in una rappresentazione di stringa, invoca ToString
.
public override string ToString()
{
// replace the line below with your code
return base.ToString();
}
Altri suggerimenti
Dovresti sovrascrivere ToString () sebbene in alcune situazioni potresti trovare utile il seguente codice:
public static class ObjectUtility
{
public static string ToDebug(this object obj)
{
if (obj == null)
return "<null>";
var type = obj.GetType();
var props = type.GetProperties();
var sb = new StringBuilder(props.Length * 20 + type.Name.Length);
sb.Append(type.Name);
sb.Append("\r\n");
foreach (var property in props)
{
if (!property.CanRead)
continue;
// AppendFormat defeats the point
sb.Append(property.Name);
sb.Append(": ");
sb.Append(property.GetValue(obj, null));
sb.Append("\r\n");
}
return sb.ToString();
}
}
L'uso è semplicemente quello di includere lo spazio dei nomi contenente ObjectUtility e quindi ...
var f = new F();
Console.WriteLine(f.ToDebug());
L'uso della riflessione sopra non è molto buono per il codice ad alte prestazioni, quindi non utilizzarlo in uno scenario di produzione in cui si desiderano prestazioni elevate.
Continuerei a usare ToString (). Questo è il suo scopo per esistere. Inoltre, a meno che tu non abbia una stringa di formato, puoi semplicemente scrivere:
Console.WriteLine(objectF)
Ho trovato la causa del mio problema. Avevo trascurato di definire la mia implementazione di ToString () come override . La sintassi corretta è:
public override string ToString()
{
///Do stuff...
return string;
}
Grazie ai poster in basso che mi hanno messo sulla strada giusta