public static IMapBuilderContext <TResult> MapAllProperties() { IMapBuilderContext <TResult> mapBuilderContext = (IMapBuilderContext <TResult>) new MapBuilder <TResult> .MapBuilderContext(); foreach (PropertyInfo property in ((IEnumerable <PropertyInfo>) typeof(TResult).GetProperties(BindingFlags.Instance | BindingFlags.Public)).Where <PropertyInfo>((Func <PropertyInfo, bool>)(property => MapBuilder <TResult> .IsAutoMappableProperty(property)))) { mapBuilderContext = mapBuilderContext.MapByName(property); } return(mapBuilderContext); }
/// <summary> /// Tạo mapper /// </summary> /// <typeparam name="T">Kiểu đối tượng</typeparam> /// <param name="reader">Đối tượng IDataReader</param> /// <param name="sqlName">Tên đầy đủ của câu sql. VD: Sql.BT0000.GetAll</param> /// <returns></returns> private static IRowMapper <T> GetRowMapper <T>(IDataReader reader, string sqlName = "") where T : new() { IRowMapper <T> result = null; Type type = typeof(T); bool cache = !string.IsNullOrEmpty(sqlName); int hashCode = (type.FullName + sqlName).GetHashCode(); // Kiểm tra mapper đã được cache hay chưa if (cache && RowMappers.ContainsKey(hashCode)) { result = (IRowMapper <T>)RowMappers[hashCode]; } // Nếu không được cache thì tạo mới else { IMapBuilderContext <T> context = MapBuilder <T> .MapNoProperties(); PropertyInfo property = null; string propertyName = string.Empty; for (int i = reader.FieldCount - 1; i >= 0; i--) { propertyName = reader.GetName(i); property = type.GetProperty(propertyName); // Trường hợp không lấy đc property thì lấy theo column name if (property == null) { // Lấy dữ liệu property theo column của Object property = type.GetProperties().FirstOrDefault(prop => prop.GetCustomAttributes(false) .OfType <ColumnAttribute>() .Any(attribute => attribute.Name == propertyName)); } // Chỉ map những field vừa có trong câu sql vừa có trong đối tượng if (property != null && property.CanRead && property.CanWrite) { context.MapByName(property); } } result = context.Build(); // Nếu có yêu cầu cache thì lưu vào cache if (reader.FieldCount > 0 && cache) { RowMappers.Add(hashCode, result); } } return(result); }