private static Type CreateRowType(GenericParsing.GenericParser parser) { // create a dynamic assembly and module AssemblyName assemblyName = new AssemblyName(); assemblyName.Name = "tmpAssembly"; AssemblyBuilder assemblyBuilder = Thread.GetDomain().DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run); ModuleBuilder module = assemblyBuilder.DefineDynamicModule("tmpModule"); // create a new type builder TypeBuilder typeBuilder = module.DefineType("BindableRowCellCollection", TypeAttributes.Public | TypeAttributes.Class); for (int col = 0; col < parser.ColumnCount; col++) { string propertyName = parser.GetColumnName(col); // Generate a private field FieldBuilder field = typeBuilder.DefineField("_" + propertyName, typeof(string), FieldAttributes.Private); // Generate a public property PropertyBuilder property = typeBuilder.DefineProperty(propertyName, PropertyAttributes.None, typeof(string), new Type[] { typeof(string) }); MethodAttributes GetSetAttr = MethodAttributes.Public | MethodAttributes.HideBySig; // Define the "get" accessor method for current private field. MethodBuilder currGetPropMthdBldr = typeBuilder.DefineMethod("get_value", GetSetAttr, typeof(string), Type.EmptyTypes); // Intermediate Language stuff... ILGenerator currGetIL = currGetPropMthdBldr.GetILGenerator(); currGetIL.Emit(OpCodes.Ldarg_0); currGetIL.Emit(OpCodes.Ldfld, field); currGetIL.Emit(OpCodes.Ret); // Define the "set" accessor method for current private field. MethodBuilder currSetPropMthdBldr = typeBuilder.DefineMethod("set_value", GetSetAttr, null, new Type[] { typeof(string) }); // Again some Intermediate Language stuff... ILGenerator currSetIL = currSetPropMthdBldr.GetILGenerator(); currSetIL.Emit(OpCodes.Ldarg_0); currSetIL.Emit(OpCodes.Ldarg_1); currSetIL.Emit(OpCodes.Stfld, field); currSetIL.Emit(OpCodes.Ret); // Last, we must map the two methods created above to our PropertyBuilder to // their corresponding behaviors, "get" and "set" respectively. property.SetGetMethod(currGetPropMthdBldr); property.SetSetMethod(currSetPropMthdBldr); } return(typeBuilder.CreateType()); }
private object UploadFile(string file, bool hasHeader, string delimiter) { object retVal = null; try { using (GenericParsing.GenericParser rawFileParser = new GenericParsing.GenericParser(file)) { rawFileParser.SetDataSource(file); rawFileParser.ColumnDelimiter = delimiter == "Comma" ? ',' : '\t'; rawFileParser.FirstRowHasHeader = hasHeader; rawFileParser.SkipStartingDataRows = 10; rawFileParser.MaxBufferSize = 4096; rawFileParser.MaxRows = -1; rawFileParser.TextQualifier = '\"'; Type rowType = null; rawFileParser.Read(); rowType = CreateRowType(rawFileParser); Type[] types = new Type[] { rowType }; Type listType = typeof(List <>); Type dataTableType = listType.MakeGenericType(types); object allData = Activator.CreateInstance(dataTableType); do { object row = null; row = Activator.CreateInstance(rowType); for (int col = 0; col < rawFileParser.ColumnCount; col++) { string propertyName = rawFileParser.GetColumnName(col); rowType.GetProperty(propertyName).SetValue(row, rawFileParser[propertyName]); } dataTableType.GetMethod("Add").Invoke(allData, new object[] { row }); } while (rawFileParser.Read()); retVal = allData; } } catch (Exception ex) { Odp.Data.ErrorLog.WriteError(ex.Message); } return(retVal); }
private object UploadFile(string file, bool hasHeader, string delimiter) { object retVal = null; try { using (GenericParsing.GenericParser rawFileParser = new GenericParsing.GenericParser(file)) { rawFileParser.SetDataSource(file); rawFileParser.ColumnDelimiter = delimiter == "Comma" ? ',' : '\t'; rawFileParser.FirstRowHasHeader = hasHeader; rawFileParser.SkipStartingDataRows = 10; rawFileParser.MaxBufferSize = 4096; rawFileParser.MaxRows = -1; rawFileParser.TextQualifier = '\"'; Type rowType = null; rawFileParser.Read(); rowType = CreateRowType(rawFileParser); Type[] types = new Type[] { rowType }; Type listType = typeof(List<>); Type dataTableType = listType.MakeGenericType(types); object allData = Activator.CreateInstance(dataTableType); do { object row = null; row = Activator.CreateInstance(rowType); for (int col = 0; col < rawFileParser.ColumnCount; col++) { string propertyName = rawFileParser.GetColumnName(col); rowType.GetProperty(propertyName).SetValue(row, rawFileParser[propertyName]); } dataTableType.GetMethod("Add").Invoke(allData, new object[] { row }); } while (rawFileParser.Read()); retVal = allData; } } catch (Exception ex) { Odp.Data.ErrorLog.WriteError(ex.Message); } return retVal; }