/// <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); }
/// <summary> /// 获取IMapper<<typeparamref name="T"/>> /// </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(); }
/// <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)); }