映射到字典

问题描述:

我试图映射一个csv文件,以便每个记录只是一个字典。映射到字典

我收到一个ArgumentException“不是成员访问;”当我尝试这样做。下面的代码包括:

public class CsvFileReader : FileReader 
{ 
    public CsvFileReader(string path) : base(path){ } 

    public IDictionary<string, object> Read() 
    { 
     var reader = new CsvReader(new StreamReader(Path)); 
     reader.Read(); 
     reader.Configuration.RegisterClassMap(new DictionaryClassMap(reader.FieldHeaders)); 
     return reader.GetRecord<Dictionary<string, object>>(); 
    } 

    private class DictionaryClassMap : CsvClassMap<Dictionary<string, object>> 
    { 
     private readonly IEnumerable<string> _headers; 

     public DictionaryClassMap(IEnumerable<string> headers) 
     { 
      _headers = headers; 
     } 

     public override void CreateMap() 
     { 
      foreach (var header in _headers) 
      { 
       var localHeader = header; 
       Map(x => x[localHeader]); 
      } 
     } 
    } 
} 

不幸的是,目前还映射到Dictionary不支持。

如果您尝试执行GetRecords<Dictionary<string, object>>(),您将收到错误消息。

Types that inhererit IEnumerable cannot be auto mapped. Did you accidentally call GetRecord or WriteRecord which acts on a single record instead of calling GetRecords or WriteRecords which acts on a list of records? 

您也不能映射到Dictionary。在映射中,您需要为要映射到的字段指定类的属性。索引器不是一个成员属性,这就是为什么你会得到这个错误。

SOLUTION:

你可以做的是这样的:

var record = csv.GetRecord<dynamic>(); 

你可以使用它作为一个动态对象。

期望解

在内部,它采用了ExpandoObject,这样你就可以做到这一点。

var dict = csv.GetRecord<dynamic>() as IDictionary<string, object>;