Пример #1
0
        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);
        }
Пример #2
0
        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);
        }