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

输出为

ProcessInvocation86.exe 信息:0:{时间 = 04.11.2012 22:07:52,名称 = Hello }

我想在我的应用程序中使用不同的格式。有没有办法在 C# 中更改匿名对象的 ToString() 的实现?也许每个静态字段AppDomain或其他东西?

4

4 回答 4

8

不,你不能这样做 - ToString, Equals, 并且GetHashCode有框架提供的默认实现。要覆盖此功能,您应该从您的匿名类型继承,这是不可能的。

用于String.Format获得所需的输出。

于 2012-11-04T20:19:46.177 回答
4

据我所知,没有办法覆盖默认ToString行为。
可能值得看看 Eric Lippert 关于匿名类型的一些帖子: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 回答