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); }
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)); } }