我正要在特定的业务类上实现 ToString() 的重写,以便生成 Excel 友好的格式来写入输出文件,稍后将拾取并处理该输出文件。数据应如下所示:
5555555 "LASTN SR, FIRSTN" 5555555555 13956 STREET RD TOWNSVILLE MI 48890 25.88 01-003-06-0934
对我来说,只需制作一个格式字符串并覆盖就没什么大不了的ToString()
,但这会改变的行为ToString()
对于任何对象,我决定以这种方式序列化,从而实现ToString()
整个图书馆都衣衫褴褛。
现在,我一直在阅读格式提供者 http://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx,一个实现它的类听起来是个好主意,但我仍然对所有这些逻辑应该驻留在哪里以及如何构建格式化程序类感到有点困惑。
当您需要从对象中创建 CSV、制表符分隔或其他非 XML 任意字符串时,你们会怎么做?
以下是使用反射从对象列表创建 CSV 的通用方式:
public static string ToCsv<T>(string separator, IEnumerable<T> objectlist)
{
Type t = typeof(T);
FieldInfo[] fields = t.GetFields();
string header = String.Join(separator, fields.Select(f => f.Name).ToArray());
StringBuilder csvdata = new StringBuilder();
csvdata.AppendLine(header);
foreach (var o in objectlist)
csvdata.AppendLine(ToCsvFields(separator, fields, o));
return csvdata.ToString();
}
public static string ToCsvFields(string separator, FieldInfo[] fields, object o)
{
StringBuilder linie = new StringBuilder();
foreach (var f in fields)
{
if (linie.Length > 0)
linie.Append(separator);
var x = f.GetValue(o);
if (x != null)
linie.Append(x.ToString());
}
return linie.ToString();
}
可以进行许多变体,例如直接在 ToCsv() 中写入文件,或者用 IEnumerable 和yield 语句替换 StringBuilder。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)