4

各レコードが単に .csv ファイルになるように 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]);
            }
        }
    } 
}
4

2 に答える 2

12

残念ながら、現在、 へのマッピングはサポートされていません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>;
于 2014-04-10T19:42:17.983 に答える