// Copyright 2009-2022 Josh Close // This file is a part of CsvHelper and is dual licensed under MS-PL and Apache 2.0. // See LICENSE.txt for details or visit http://www.opensource.org/licenses/ms-pl.html for MS-PL and http://opensource.org/licenses/Apache-2.0 for Apache 2.0. // https://github.com/JoshClose/CsvHelper using System; using System.Collections.Generic; using System.Dynamic; namespace CsvHelper.Expressions { /// /// Creates dynamic records. /// public class DynamicRecordCreator : RecordCreator { /// /// Initializes a new instance. /// /// The reader. public DynamicRecordCreator(CsvReader reader) : base(reader) { } /// /// Creates a of type /// that will create a record of the given type using the current /// reader row. /// /// The record type. protected override Delegate CreateCreateRecordDelegate(Type recordType) => (Func)CreateDynamicRecord; /// /// Creates a dynamic record of the current reader row. /// protected virtual dynamic CreateDynamicRecord() { var obj = new ExpandoObject(); var dict = obj as IDictionary; if (Reader.HeaderRecord != null) { for (var i = 0; i < Reader.HeaderRecord.Length; i++) { var args = new GetDynamicPropertyNameArgs(i, Reader.Context); var propertyName = Reader.Configuration.GetDynamicPropertyName(args); Reader.TryGetField(i, out string field); dict.Add(propertyName, field); } } else { for (var i = 0; i < Reader.Parser.Count; i++) { var args = new GetDynamicPropertyNameArgs(i, Reader.Context); var propertyName = Reader.Configuration.GetDynamicPropertyName(args); var field = Reader.GetField(i); dict.Add(propertyName, field); } } return obj; } } }