Ejemplo n.º 1
0
        /// <summary>
        /// 映射数据源中的数据到目标对象
        /// </summary>
        /// <typeparam name="TDestination"></typeparam>
        /// <param name="source"></param>
        /// <returns></returns>
        public static List <TDestination> List <TDestination>(object source)
        {
            var accessor = GetAccessor <TDestination>();

            if (accessor == null)
            {
                throw new MapperException(string.Format("未找到适用{0}的对象访问器。", typeof(TDestination).FullName));
            }

            var typeMapper = NativeTypeMapper.GetTypeMapper <TDestination>();

            var dataSourceReader = NativeDataSourceReader.GetReader(source);
            var fields           = accessor.MetaInfo.GetPropertyNames();

            dataSourceReader.Ordinal(fields);

            var list = new List <TDestination>(dataSourceReader.Count > 0 ? dataSourceReader.Count : 8);

            object[] initData;
            while (null != (initData = dataSourceReader.Read()))
            {
                TDestination destObj = typeMapper.Cast(initData);
                if (destObj != null)
                {
                    list.Add(destObj);
                }
            }
            return(list);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 获取IMapper&lt;<typeparamref name="T"/>&gt;
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public static IObjectAccessor <T> GetAccessor <T>()
        {
            var typeMapper = NativeTypeMapper.GetTypeMapper <T>() as ObjectTypeMapper <T>;

            if (typeMapper != null)
            {
                return(typeMapper.ObjAccessor);
            }

            return(default(IObjectAccessor <T>));
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="field"></param>
        public PropertyAccessor(PropertyInfo propertyInfo)
        {
            _typeMapper = NativeTypeMapper.GetTypeMapper(propertyInfo.PropertyType);

            var param1 = Expression.Parameter(typeof(T), "handler");
            var param2 = Expression.Parameter(typeof(object), "value");
            // 获取属性的值的方法
            var accessExp = Expression.MakeUnary(ExpressionType.Convert, Expression.MakeMemberAccess(param1, propertyInfo), typeof(object));

            _getter = Expression.Lambda <Func <T, object> >(accessExp, param1).Compile();
            // 向属性赋值的方法
            var assignExp = Expression.Assign(
                Expression.Property(param1, propertyInfo),
                Expression.Call(Expression.Convert(Expression.Constant(_typeMapper), typeof(ITypeMapper <>).MakeGenericType(propertyInfo.PropertyType)), "Cast", new Type[0], new ParameterExpression[] { param2 })
                );

            _setter = Expression.Lambda <Action <T, object> >(assignExp, param1, param2).Compile();
        }
Ejemplo n.º 4
0
        /// <summary>
        /// 映射数据源中的一行数据到目标对象
        /// </summary>
        /// <typeparam name="TDestination"></typeparam>
        /// <param name="source"></param>
        /// <returns></returns>
        public static TDestination Single <TDestination>(object source)
        {
            var accessor = GetAccessor <TDestination>();

            if (accessor == null)
            {
                throw new MapperException(string.Format("未找到适用{0}的对象访问器。", typeof(TDestination).FullName));
            }

            var dataSourceReader = NativeDataSourceReader.GetReader(source);
            var fields           = accessor.MetaInfo.GetPropertyNames();

            dataSourceReader.Ordinal(fields);

            var initData = dataSourceReader.Read();

            if (initData != null)
            {
                return(NativeTypeMapper.GetTypeMapper <TDestination>().Cast(initData));
            }

            return(default(TDestination));
        }