internal static void ReadCurrentRow(IDataReader reader, string[] columns, object instance, InterfaceMetadata metaData) { for (int i = 0; i < columns.Length; ++i) { object value = reader.GetValue(i); if (value is DBNull) { continue; } PropertyMetadata property = metaData.GetProperty(columns[i], true); property?.SetValue(instance, ConvertType(value, property.Type)); } }
internal static void ReadMultiResultset(IDataReader reader, object instance, InterfaceMetadata metaData, string[] properties) { for (int index = 0; ; ++index) { if (properties.Length <= index) { throw new ArgumentException("input properties are fewer than number of result set"); } PropertyMetadata property = metaData.GetProperty(properties[index], true); // check if result rest is a IEnumerable (only IList is supported) if (property.Type.IsGenericType && (property.Type.GetGenericTypeDefinition() == typeof(IList <>))) { Type listGenericType = property.Type.GetGenericArguments()[0]; var list = Activator.CreateInstance(typeof(List <>).MakeGenericType(listGenericType)) as IList; if (list == null) { throw new ArgumentException($"property '{property.Name}' should be of type IList or IList<>"); } string[] columns = GetColumns(reader); InterfaceMetadata propertyTypeMetadata = GetInterface(listGenericType); ReadSingleResultset(reader, columns, list, propertyTypeMetadata); property.SetValue(instance, list); } // if property type is interface then get one record from result set else if (property.Type.IsInterface && !property.Type.IsGenericType) { if (reader.Read()) { InterfaceMetadata interfaceType = GetInterface(property.Type); object value = Activator.CreateInstance(interfaceType.Concrete); string[] columns = GetColumns(reader); ReadCurrentRow(reader, columns, value, interfaceType); property.SetValue(instance, value); } } // this case require a plain data type to work correctly else { if (reader.Read()) { property.SetValue(instance, ConvertType(reader[0], property.Type)); } } if (!reader.NextResult()) { break; } } }