7
        var sample = new
        {
            Time = DateTime.Now,
            Name = "Hello"
        };
        Trace.TraceInformation("{0}", sample);

として出力

ProcessInvocation86.exe情報:0:{時間= 04.11.2012 22:07:52、名前=こんにちは}

アプリケーションで別のフォーマットが欲しいのですが。C#の匿名オブジェクトのToString()の実装を変更する方法はありますか?たぶん、何かあたりの静的フィールドAppDomain

4

4 に答える 4

8

いいえ、これを行うことはできません- ToString、、EqualsおよびGetHashCodeフレームワークによって提供されるデフォルトの実装があります。この機能をオーバーライドするには、匿名タイプから継承する必要がありますが、これは不可能です。

String.Format目的の出力を取得するために使用します。

于 2012-11-04T20:19:46.177 に答える
4

私が知る限り、デフォルトのToString動作をオーバーライドする方法はありません。
匿名タイプに関するEricLippertからの投稿のいくつかを見る価値があるかもしれません:http://blogs.msdn.com/b/ericlippert/archive/tags/anonymous+types/

この目的のために単純なクラスを作成するのがおそらく最善です。

例えば

public class MyClass
{
  public DateTime Time { get; set; }
  public string Name { get; set; }

  public override string ToString()
  {
    return string.Format("Time = {0}. Name = {1}.", Time, Name);
  }
}
于 2012-11-04T20:22:34.460 に答える
1

私は知っている、何人かの人は実際にそのような解決策のために私を殴るでしょう、そして私はあなたがそれを本番環境で使うべきではないことに同意します。いくつかのデータに特定の機能がある場合、これは間違いなく別のクラスに移動する必要があります。ただし、マイナーな問題については、このようなリフレクションを少し使用して、カスタムフォーマッターを作成できます(繰り返しますが、本番環境での使用はお勧めしません)。

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

その後、電話

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

印刷されます

Name:Ilya
Surname:Ivanov

そして、パフォーマンス上の利点のためにタイプをキャッシュし、別のタイプのトラブルに巻き込まれる可能性があります。

于 2012-11-04T20:26:11.163 に答える
0

これは必ずしも理想的ではありませんが、フォーマットを行う関数を受け取る拡張メソッドを作成することはできます。

LinqPadの例用にフォーマットされた次の

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();
       }
    }
于 2012-11-04T20:27:47.263 に答える