private static void LoadRowData(IEnumerable <ColumnInfo> columns, IRow row, object target, IRowInfo rowInfo) { var errorIndex = -1; string errorMessage = null; void ColumnFailed(IColumnInfo column, string message) { if (errorIndex >= 0) { return; // Ensures the first error will not be overwritten. } if (column.Attribute.IgnoreErrors == true) { return; } errorIndex = column.Attribute.Index; errorMessage = message; } foreach (var column in columns) { var index = column.Attribute.Index; if (index < 0) { continue; } try { var cell = row.GetCell(index); var propertyType = column.Attribute.PropertyUnderlyingType ?? column.Attribute.Property?.PropertyType; if (!MapHelper.TryGetCellValue(cell, propertyType, out object valueObj)) { ColumnFailed(column, "CellType is not supported yet!"); continue; } valueObj = column.RefreshAndGetValue(valueObj); if (column.Attribute.TryTake != null) { if (!column.Attribute.TryTake(column, target)) { ColumnFailed(column, "Returned failure by custom cell resolver!"); } } else if (propertyType != null) { // Change types between IConvertible objects, such as double, float, int and etc. if (MapHelper.TryConvertType(valueObj, column, out object result)) { column.Attribute.Property.SetValue(target, result, null); } else { ColumnFailed(column, "Cannot convert value to the property type!"); } //var value = Convert.ChangeType(valueObj, column.Attribute.PropertyUnderlyingType ?? propertyType); } } catch (Exception e) { ColumnFailed(column, e.Message); } } rowInfo.ErrorColumnIndex = errorIndex; rowInfo.ErrorMessage = errorMessage; }