映射到字典
问题描述:
我试图映射一个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>;