如何从类中列表中的列表中获取数据:其中T:class

时间:2014-08-05 23:53:11

标签: c# asp.net linq list csv

我在一个可以导出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)

1 个答案:

答案 0 :(得分:0)

“......可以使用每个类类型的所有数据导出csv的类” - 查看代码,这个断言是错误的。 MakeValueCsvFriendly()无法处理任何复杂的对象或列表,因为它最终会在所有内容上调用ToString()

您的CSVExport班级有IsListIsGenericList,但它没有在任何地方调用,让我觉得编写它的人有意支持列表,但从未对实施感到困扰。您需要检查MakeValueCSVFriendly中是否存在与DateTime一样的列表,并相应地自定义output

另一个问题是逻辑上将列表列表导出为CSV等平面表示。你期待它看起来像什么?子列表中的项目是否应显示为父列表的某个“字段”中的逗号分隔项?

      list_2
"item1, item2, item3"
"item4, item5, item6"