[英]Mapping to a Dictionary
我试图映射一个 csv 文件,以便每条记录都只是一个Dictionary<string,object>
。
我收到一个
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
。 在映射中,您需要为要映射到的字段指定类的属性。 索引器不是成员属性,这就是您收到该错误的原因。
解决方案:
你可以做的是:
var record = csv.GetRecord<dynamic>();
您可以将其用作动态对象。
期望的解决方案
在内部,它使用ExpandoObject
,因此您可以执行此操作。
var dict = csv.GetRecord<dynamic>() as IDictionary<string, object>;
我试图做类似的事情(虽然没有将所有列读入Dictionary
,只是一些)。 因此,如果这是有用的(并且在此答案的大力帮助下),您可以将Dictionary
作为类的属性,然后填充它(正如 Josh 所说,您不能像 CsvHelper 所期望的那样自行填充Dictionary
要映射到的成员属性)。
下面将映射到属性DictionaryProperty
,它是类MyClassWithDictionaryMapper
的Dictionary<string,string>
。
public class MyClassWithDictionaryMapper: ClassMap<MyClassWithDictionary>
{
public MyClassWithDictionaryMapper(List<string> headers)
{
Map(m => m.DictionaryProperty).ConvertUsing
(row => headers.Select
(column => new { column, value = row.GetField(column) })
.ToDictionary(d => d.column, d => d.value)
);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.