这个通用辅助函数遍历一个对象列表,访问它们的公共属性,并为每个对象吐出一个逗号分隔的字符串。
/// <summary>
/// Format the properties as a list of comma delimited values, one object row per.
/// </summary>
/// <typeparam name="T">Type of class contained in the List</typeparam>
/// <param name="list">A list of objects</param>
/// <returns>a list of strings in csv format</returns>
public static List<string> ToCSV<T>(this IEnumerable<T> list)
where T : class
{
var results = new List<string>();
bool firstTime = true;
foreach (var obj in list)
{
// header data
if (firstTime)
{
firstTime = false;
string line = String.Empty;
foreach (PropertyInfo propertyInfo in obj.GetType().GetProperties())
{
if (propertyInfo.CanRead)
{
line += propertyInfo.Name + ',';
}
}
results.Add(line);
}
else
{
string line = String.Empty;
foreach (PropertyInfo propertyInfo in obj.GetType().GetProperties())
{
if (propertyInfo.CanRead)
{
object value = propertyInfo.GetValue(obj, null);
if (value.GetType() == typeof(string))
{
line += "\"" + value.ToString() + "\"" + ",";
}
else
{
line += value.ToString() + ",";
}
}
}
results.Add(line);
}
}
return results;
}
此方法迭代的一个类有一个字符串属性,它被截断:
string BusinessItem { get; set; } // "0000", a legitimate business value
有问题的位在这里:
object value = propertyInfo.GetValue(obj, null); // value == 0
如何将属性的值作为字符串,而不是int?
答案 0 :(得分:3)
考虑这个检查:
if (value.GetType() == typeof(string) && (value as string).Contains(','))
这意味着如果字符串值包含逗号,则字符串值将仅在引号中写入。
字符串值"0000"
将写为0000,
到该行。如果读取文件的代码检查值是否为所有数字以确定它是否为数字,则将其解析为数字,而不是作为字符串读取。在这种情况下,您应该使用引号编写所有字符串,而不仅仅是包含逗号的字符串。