Esempio n. 1
0
        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));
        }
Esempio n. 2
0
        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));
        }