覆盖匿名对象的ToString()实现

时间:2012-11-04 20:15:23

标签: c#

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

输出为

  

ProcessInvocation86.exe信息:0:{Time = 04.11.2012 22:07:52,   名字= Hello}

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

4 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:4)

据我所知,无法覆盖默认的ToString行为 看看Eric Lippert关于匿名类型的一些帖子可能值得一看:http://blogs.msdn.com/b/ericlippert/archive/tags/anonymous+types/

可能最好为此目的创建一个简单的类:

e.g。

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

答案 2 :(得分: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

然后你可以缓存类型以获得性能优势并进入其他类型的麻烦。

答案 3 :(得分: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();
       }
    }