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
或某些东西都有一些静态字段?
答案 0 :(得分:8)
不,您不能这样做 - ToString
,Equals
和GetHashCode
具有框架提供的默认实现。要覆盖此功能,您应该从匿名类型继承,这是不可能的。
使用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();
}
}