private async Task <KeyValuePair <Type, IList> > ManualMapType(Type type, WorkbookSheet sheet) { await Task.Delay(0).ConfigureAwait(false); var fields = type.GetFields(BindingFlags.Public | BindingFlags.Instance) .Where(f => f.IsDefined(typeof(FieldMappingAttribute))); var properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance) .Where(f => f.IsDefined(typeof(FieldMappingAttribute))); List <object> values = new List <object>(sheet.Rows.Count - 1); for (int r = 1; r < sheet.Rows.Count; r++) { var row = sheet.Rows[r]; object obj = Activator.CreateInstance(type); foreach (FieldInfo field in fields) { FieldInfo fieldInfo = type.GetField(field.Name); string lookingForColumnName = fieldInfo.GetCustomAttribute <FieldMappingAttribute>().WorkbookHeader; if (sheet.TryToGetColumnIndexByName(lookingForColumnName, out int value)) { if (!ReflectionParser.SetValue(fieldInfo, obj, row[value].Value)) { throw new Exception($"Field '{fieldInfo.Name}' in type '{type.FullName}' doesn't match the type of data in WorkbookSheet '{sheet.Name}' in column '{value}'"); } } else { throw new Exception($"In workbooksheet '{sheet.Name}' there is no such a column like '{lookingForColumnName}' defined in '{type.FullName}' on field '{fieldInfo.Name}'"); } } foreach (PropertyInfo property in properties) { PropertyInfo p = type.GetProperty(property.Name); string lookingForColumnName = p.GetCustomAttribute <FieldMappingAttribute>().WorkbookHeader; if (sheet.TryToGetColumnIndexByName(lookingForColumnName, out int value)) { if (!ReflectionParser.SetValue(p, obj, row[value].Value)) { throw new Exception($"Property '{p.Name}' in type '{type.FullName}' doesn't match the type of data in WorkbookSheet '{sheet.Name}' in column '{value}'"); } } else { throw new Exception($"In workbooksheet '{sheet.Name}' there is no such a column like '{lookingForColumnName}' defined in '{type.FullName}' on property '{p.Name}'"); } } values.Add(obj); } return(new KeyValuePair <Type, IList>(type, values)); }
private async Task <KeyValuePair <Type, IList> > AutoMapType(Type type, WorkbookSheet sheet) { await Task.Delay(0).ConfigureAwait(false); var fields = type.GetFields(BindingFlags.Public | BindingFlags.Instance) .Where(w => sheet.WorkbookHeader.Titles.Contains(w.Name)); var properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance) .Where(w => sheet.WorkbookHeader.Titles.Contains(w.Name)); // Iterate from 1 because header is on the index 0. List <object> values = new List <object>(sheet.Rows.Count - 1); for (int r = 1; r < sheet.Rows.Count; r++) { var row = sheet.Rows[r]; object obj = Activator.CreateInstance(type); foreach (FieldInfo field in fields) { FieldInfo fieldInfo = type.GetField(field.Name); if (sheet.TryToGetColumnIndexByName(fieldInfo.Name, out int value)) { // If we can cast type if (!ReflectionParser.SetValue(fieldInfo, obj, row[value].Value)) { throw new Exception( $"Field '{fieldInfo.Name}' in type '{type.FullName}' doesn't match the type of data in WorkbookSheet '{sheet.Name}' in column '{value}'"); } } } foreach (PropertyInfo property in properties) { PropertyInfo p = type.GetProperty(property.Name); if (sheet.TryToGetColumnIndexByName(p.Name, out int value)) { if (!ReflectionParser.SetValue(p, obj, row[value].Value)) { throw new Exception( $"Property '{p.Name}' in type '{type.FullName}' doesn't match the type of data in WorkbookSheet '{sheet.Name}' in column '{value}'"); } } } values.Add(obj); } return(new KeyValuePair <Type, IList>(type, values)); }