Quale interfaccia o metodo dovrebbe implementare la mia classe per stampare ciò che voglio in Console.WriteLine?

StackOverflow https://stackoverflow.com/questions/188625

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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top