映射到字典

时间:2014-01-23 14:46:48

标签: c# csvhelper

我试图映射一个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]);
            }
        }
    } 
}

2 个答案:

答案 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>