1

クラス F のオブジェクトがあります。Console.WriteLine を使用してオブジェクトの内容を出力し、次のような迅速で汚いステータス更新を行いたいと考えています。

Console.WriteLine(objectF);

これにより、クラスの名前のみがコンソールに出力されます。

F

オブジェクトとそのプロパティに関する有用な情報を代わりに出力できるように、何らかの形でこれをオーバーロードしたいと考えています。

すでに回避策があります。クラスで ToString メソッドをオーバーロードしてから呼び出すには: Console.WriteLine(objectF.ToString());

しかし、私はより単純な構文を使用したいと考えています。何か案は?

4

4 に答える 4

6

Console.WriteLine(objectF)

オーバーロードした場合、動作するはずですToString。オブジェクトを文字列表現に変換する必要がある場合、フレームワークは を呼び出しますToString

public override string ToString()
{
    // replace the line below with your code
    return base.ToString();
}
于 2008-10-09T18:42:35.563 に答える
2

ToString() をオーバーライドする必要がありますが、状況によっては、次のコードが役立つ場合があります。

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();
    }
}

使用法は、ObjectUtility を含む名前空間を単純にインクルードしてから...

var f = new F();
Console.WriteLine(f.ToDebug());

上記のリフレクションの使用は、高性能コードにはあまり適していないため、高性能が必要な運用シナリオでは使用しないでください。

于 2008-10-09T21:34:02.097 に答える
1

私は引き続き ToString() を使用します。それが存在する目的です。また、フォーマット文字列がない場合は、次のように記述できます。

Console.WriteLine(objectF)
于 2008-10-09T18:43:22.783 に答える
1

問題の原因を見つけました。ToString() の実装をoverrideとして定義するのを怠っていました。正しい構文は次のとおりです。

public override string ToString()
{
   ///Do stuff...
   return string;
}

私を正しい軌道に乗せてくれた下のポスターに感謝します

于 2008-10-09T18:50:16.843 に答える