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