我试图映射一个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]);
}
}
}
}
答案 0 :(得分:3)
不幸的是,目前不支持映射到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>;
答案 1 :(得分:1)
我正在尝试做类似的事情(尽管没有将所有列都读到Dictionary
中,只是其中一些)。因此,在这种情况下有用的情况下((在this answer的大力协助下),您可以将Dictionary
作为类的属性,然后进行填充(如乔什所说,您不能填充{ {1}}本身就是因为CsvHelper期望成员属性可以映射到)。
以下内容将映射到属性Dictionary
,它是类DictionaryProperty
的{{1}}。
Dictionary<string,string>