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
        protected override IFormatReaderContext Create(XmlNameTable parameter)
        {
            var context = _contexts.Get(parameter);
            var mapper  = new IdentityMapper(_store, context.NamespaceManager);

            var reflector = new TypePartReflector(mapper, _types);
            var types     = new TypeParser(reflector);
            var parser    = new ReflectionParser(types, reflector);
            var result    = new FormatReaderContext(mapper, parser, mapper);

            return(result);
        }
Esempio n. 3
0
        protected override IFormatReaderContext Create(System.Xml.XmlReader parameter)
        {
            var resolver = Determine(parameter) ?? parameter as IXmlNamespaceResolver ?? Default(parameter);
            var mapper   = new IdentityMapper(_store, resolver);

            var reflector = new TypePartReflector(mapper, _types);
            var types     = new TypeParser(reflector);
            var parser    = new ReflectionParser(types, reflector);
            var result    = new FormatReaderContext(mapper, parser);

            return(result);
        }
Esempio n. 4
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));
        }
Esempio n. 5
0
        protected override IFormatReaderContext Create(System.Xml.XmlReader parameter)
        {
            var resolver = _contexts.IsSatisfiedBy(parameter.NameTable)
                                               ? _contexts.Get(parameter.NameTable)
                           .NamespaceManager
                                               : parameter as IXmlNamespaceResolver ?? Default(parameter);
            var mapper = new IdentityMapper(_store, resolver);

            var reflector = new TypePartReflector(mapper, _types);
            var types     = new TypeParser(reflector);
            var parser    = new ReflectionParser(types, reflector);
            var result    = new FormatReaderContext(mapper, parser);

            return(result);
        }
Esempio n. 6
0
        public void CreateRange <T>(params T[] items) where T : Model
        {
            Type    type = typeof(T);
            XmlNode root = GetTypeNodeItemsSection(type, document);

            foreach (T item in items)
            {
                XmlElement           xmlElement = document.CreateElement("item");
                List <PropertyValue> values     = ReflectionParser.GetProperties(item);

                SetXmlElementAttributes(xmlElement, values);

                root.AppendChild(xmlElement);
            }
        }
Esempio n. 7
0
        public IEnumerable <T> GetAll <T>() where T : Model
        {
            Type     type  = typeof(T);
            XmlNode  root  = GetTypeNodeItemsSection(type, document);
            List <T> items = new List <T>();

            for (int i = 0; i < root.ChildNodes.Count; i++)
            {
                XmlNode xmlNode = root.ChildNodes[i];
                T       item    = typeof(T).GetConstructor(Type.EmptyTypes).Invoke(null) as T;
                var     values  = GetPropertyValuesFromNode(xmlNode);
                ReflectionParser.SetPropertiesValues <T>(item, values);
                items.Add(item);
            }
            return(items);
        }
Esempio n. 8
0
        public T Get <T>(int id) where T : Model
        {
            Type    type = typeof(T);
            XmlNode root = GetTypeNodeItemsSection(type, document);

            XmlNode itemNode = GetNodeById(id, root.ChildNodes);

            if (itemNode != null)
            {
                T   item   = typeof(T).GetConstructor(Type.EmptyTypes).Invoke(null) as T;
                var values = GetPropertyValuesFromNode(itemNode);
                ReflectionParser.SetPropertiesValues <T>(item, values);
                return(item);
            }
            return(null);
        }
Esempio n. 9
0
        public void UpdateRange <T>(params T[] items) where T : Model
        {
            Type    type = typeof(T);
            XmlNode root = GetTypeNodeItemsSection(type, document);

            foreach (T item in items)
            {
                List <PropertyValue> values = ReflectionParser.GetProperties(item);
                int     id       = item.Id;
                XmlNode itemNode = GetNodeById(id, root.ChildNodes);

                if (itemNode != null)
                {
                    UpdateXmlNode(itemNode, values);
                }
            }
        }