我在一个可以导出csv的类中工作,其中包含每个类类型的所有数据, 思考,是我在导出一个列表中列表和另一个列表内的类时遇到问题,而且我不知道如何使用propertyInfo获取该数据,我已经尝试使用linq查询,但同样的问题来到我。
我在导出C类的类型时遇到问题:
public class a
{
private string _val {get;set;}
public string value1{get{return _val;}set{_val = value;}}
}
public class b{
private List<a> _list1 = new List<a>();
public List<a> list_1{get{return _list1;}set{_list1=value;}}
}
public class c{
private List<b> _list2 = new List<b>();
pulic List<b> list_2 {get{return _list2;}set{_list2=value;}}
}
这是我用来尝试导出csv文件的类:
namespace MvcWufooApi.Utilerias
{
public class CsvExport<T> where T :class
//public class CsvExport<T,D> where T :class
// where D:class
{
public List<T> Objects;
public CsvExport(List<T> objects)
{
Objects = objects;
}
public string Export()
{
return Export(true);
}
public string Export(bool includeHeaderLine)
{
StringBuilder sb = new StringBuilder();
//Get properties using reflection.
//IList<PropertyInfo> propertyInfos = typeof(T).GetProperties(BindingFlags.Public|BindingFlags.Static);
PropertyInfo[] propertyInfos = typeof(T).GetProperties();
if (includeHeaderLine)
{
//add header line.
foreach (PropertyInfo propertyInfo in propertyInfos)
{
sb.Append(propertyInfo.Name).Append(",");
}
sb.Remove(sb.Length - 1, 1).AppendLine();
}
//add value for each property.
foreach (T obj in Objects)
{
foreach (PropertyInfo propertyInfo in propertyInfos)
{
sb.Append(MakeValueCsvFriendly(propertyInfo.GetValue(obj, null))).Append(",");
}
sb.Remove(sb.Length - 1, 1).AppendLine();
}
return sb.ToString();
}
//export to a file.
public void ExportToFile(string path)
{
File.WriteAllText(path, Export());
}
private bool IsList(object objeto){
return objeto is IList ||
IsGenericList(objeto);
}
private bool IsGenericList(object objeto) {
var type = objeto.GetType();
return type.IsGenericType
&& typeof(List<>) == type.GetGenericTypeDefinition();
}
//export as binary data.
public byte[] ExportToBytes()
{
return Encoding.UTF8.GetBytes(Export());
}
//get the csv value for field.
private string MakeValueCsvFriendly(object value)
{
if (value == null) return "";
if (value is Nullable && ((INullable)value).IsNull) return "";
if (value is DateTime)
{
if (((DateTime)value).TimeOfDay.TotalSeconds == 0)
return ((DateTime)value).ToString("yyyy-MM-dd");
return ((DateTime)value).ToString("yyyy-MM-dd HH:mm:ss");
}
string output = value.ToString();
if (output.Contains(",") || output.Contains("\""))
output = '"' + output.Replace("\"", "\"\"") + '"';
return output;
}
}
}
这就是我使用CsvExport类的方法: // list = new List(); CsvExport csv = new CsvExport(list)
答案 0 :(得分:0)
“......可以使用每个类类型的所有数据导出csv的类” - 查看代码,这个断言是错误的。 MakeValueCsvFriendly()
无法处理任何复杂的对象或列表,因为它最终会在所有内容上调用ToString()
。
您的CSVExport
班级有IsList
和IsGenericList
,但它没有在任何地方调用,让我觉得编写它的人有意支持列表,但从未对实施感到困扰。您需要检查MakeValueCSVFriendly
中是否存在与DateTime
一样的列表,并相应地自定义output
。
另一个问题是逻辑上将列表列表导出为CSV等平面表示。你期待它看起来像什么?子列表中的项目是否应显示为父列表的某个“字段”中的逗号分隔项?
list_2
"item1, item2, item3"
"item4, item5, item6"