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