protected T ParseData <T>(List <string> lines, FieldType fieldType) where T : class, new() { var data = new T(); LoadNewDefaultConfig(data); var accessor = TypeAccessor.Create(typeof(T), true); var membersData = accessor.GetMembers().Where(a => a.IsDefined(typeof(FixedWidthAttribute))).ToList(); //var properties = data.GetType().GetProperties().Where(a => Attribute.IsDefined(a, typeof(FixedWidthAttribute))).ToList(); // Reflection - DEPRECATED //foreach (var property in properties) foreach (var member in membersData) { if (!member.CanWrite) { continue; } FixedWidthAttribute attribute = null; int lineIndex = 0; if (fieldType == FieldType.LineField) { attribute = member.GetMemberAttributes <FixedWidthLineFieldAttribute>().SingleOrDefault(a => a.StructureTypeId == StructureTypeId); } else if (fieldType == FieldType.FileField) { attribute = member.GetMemberAttributes <FixedWidthFileFieldAttribute>().SingleOrDefault(a => a.StructureTypeId == StructureTypeId); // Deprecated from when every StructureType had all Properties and those that did not had it's specific attribute took the one with higest StructureTypeId //field = property.GetCustomAttributes<FixedWidthFileFieldAttribute>().Where(a => a.StructureTypeId <= structureTypeId).OrderByDescending(a => a.StructureTypeId).FirstOrDefault(); var fileField = (FixedWidthFileFieldAttribute)attribute; if (fileField.Line == 0) { throw new InvalidOperationException("'Line' parameter of [FixedWidthFileFieldAttribute] can not be zero."); } lineIndex = fileField.LineIndex; if (lineIndex < 0) // line is counted from bottom { lineIndex += lines.Count + 1; } } if (attribute != null) { string valueString = lines[lineIndex]; int startIndex = attribute.StartIndex; int length = attribute.Length; if (startIndex > 0 || length > 0) // Length = 0; means value is entire line { if (valueString.Length < startIndex + length) { throw new InvalidOperationException($"Property: Name={member.Name}, Value='{valueString}', Length={valueString.Length}" + $"not enough for Substring: Start={startIndex + 1}, Length={length})"); } valueString = (length == 0) ? valueString.Substring(startIndex) : valueString.Substring(startIndex, length); } valueString = valueString.Trim(); object value = ParseStringValueToObject(valueString, member, attribute); accessor[data, member.Name] = value; //property.SetValue(data, value); // With Reflection - DEPRECATED } } return(data); }
protected object ParseStringValueToObject(string valueString, Member member, FixedWidthAttribute attribute) { var underlyingType = Nullable.GetUnderlyingType(member.Type); string valueTypeName = underlyingType != null ? underlyingType.Name : member.Type.Name; object value = null; if (string.IsNullOrEmpty(valueString)) { if (underlyingType == null && valueTypeName != nameof(String)) { throw new InvalidOperationException($"Empty string cannot be parsed to not nullable Property: Name={member.Name}, Type={valueTypeName}"); } return(value); } ParserHandler Parser = null; string format = attribute.Format; switch (valueTypeName) { case nameof(String): Parser = ParserString; break; case nameof(Char): Parser = ParserChar; break; case nameof(Decimal): case nameof(Single): case nameof(Double): case nameof(Int32): case nameof(Int64): { format = format ?? DefaultConfig.FormatNumberDecimal; Parser = ParserNumber; break; } case nameof(Boolean): { format = format ?? DefaultConfig.FormatBoolean; Parser = ParserBoolean; break; } case nameof(DateTime): { format = format ?? DefaultConfig.FormatDateTime; Parser = ParserDateTime; break; } } try { value = Parser(valueString, valueTypeName, format); } catch { throw new InvalidCastException($"Property: Name={member.Name}, Value ={valueString}, Format={format} cannot be parsed to Type={valueTypeName}"); } return(value); }