public ICsvRowActivatorFactory <T> Create(IConverterProvider converterProvider, IColumnNameMapper columnNameMapper)
        {
            // Create assembly/module
            bool            saveDll         = false;
            AssemblyName    assemblyName    = new AssemblyName("DynamicCsvRowActivator");
            AssemblyBuilder assemblyBuilder = BuildAssembly(assemblyName, new Version(1, 0, 0, 0), saveDll);
            ModuleBuilder   moduleBuilder   = BuildModule(assemblyBuilder, assemblyName, saveDll);

            // Create activator type
            DynamicCsvRowActivatorBuilder <T> activatorBuilder
                = new DynamicCsvRowActivatorBuilder <T>(converterProvider, columnNameMapper);

            TypeBuilder     activatorTypeBuilder = activatorBuilder.Build(assemblyBuilder, moduleBuilder);
            Type            activatorType        = activatorTypeBuilder.CreateType();
            ConstructorInfo activatorConstructor = activatorType.GetConstructor(new Type[] { typeof(string[]) });

            // Create factory type
            DynamicCsvRowActivatorFactoryBuilder <T> factoryBuilder
                = new DynamicCsvRowActivatorFactoryBuilder <T>();
            TypeBuilder     typeBuilder        = factoryBuilder.Build(assemblyBuilder, moduleBuilder, activatorConstructor);
            Type            factoryType        = typeBuilder.CreateType();
            ConstructorInfo factoryConstructor = factoryType.GetConstructor(Type.EmptyTypes);

            // Save the dll
            if (saveDll)
            {
                assemblyBuilder.Save("DynamicCsvRowActivator.dll");
            }

            // Create an instance of a factory
            ICsvRowActivatorFactory <T> factory = (ICsvRowActivatorFactory <T>)factoryConstructor.Invoke(new object[] { });

            return(factory);
        }
        private ICsvRowActivator <T> CreateSut <T>(string[] headerrow)
        {
            ICsvRowActivatorFactoryFactory <T> csvRowActivatorFactoryFactory
                = new DynamicCsvRowActivatorFactoryFactory <T>();
            IColumnNameMapper           columnNameMapper  = new DefaultColumnNameMapper();
            IConverterProvider          converterProvider = new DefaultConverterProvider();
            ICsvRowActivatorFactory <T> csvRowActivatorFactory
                = csvRowActivatorFactoryFactory.Create(converterProvider, columnNameMapper);
            ICsvRowActivator <T> activator = csvRowActivatorFactory.Create(headerrow);

            return(activator);
        }
예제 #3
0
        public IEnumerable <T> ReadAll()
        {
            // Create an activator factory
            ICsvRowActivatorFactory <T> activatorFactory = activatorFactoryFactory.Create(
                new DefaultConverterProvider(),
                new DefaultColumnNameMapper()
                );

            // Create a tokenizer that reads from the csvStream
            CsvRowTokenizer tokenizer = new CsvRowTokenizer(csvStream);

            // Start streaming data from the tokenizer
            IEnumerable <string[]> rows = tokenizer.ReadAllRows();

            // Grab the first line (the header)
            IEnumerator <string[]> enumerator = rows.GetEnumerator();

            if (!enumerator.MoveNext())
            {
                throw new InvalidDataException("No header found!");
            }
            string[] headerrow   = enumerator.Current;
            int      columnCount = headerrow.Length;

            // Start streaming tokenized data into the activator
            ICsvRowActivator <T> activator = activatorFactory.Create(headerrow);

            // Stream out all of the CSV rows as objects
            while (enumerator.MoveNext())
            {
                if (enumerator.Current.Length != columnCount)
                {
                    throw new InvalidDataException(
                              string.Format("Field count mismatch: a row had {0} field(s), but header had {1}!", enumerator.Current.Length, columnCount)
                              );
                }
                yield return(activator.CreateFromRow(enumerator.Current));
            }
        }