private static void GetGeneralMemberBindings(object obj, Type sourceType, Type conversionType, ParameterExpression parExp, List <MemberBinding> bindings, ConvertMapper mapper) { var lazyMgr = obj as ILazyManager; foreach (var property in conversionType.GetProperties(BindingFlags.Public | BindingFlags.Instance)) { try { if (lazyMgr != null && !lazyMgr.IsValueCreated(property.Name)) { continue; } Expression descExp = null; //在映射器里查找转换表达式 if (mapper != null) { descExp = mapper.GetMapExpression(property); if (descExp != null) { descExp = (ExpressionReplacer.Replace(descExp, parExp) as LambdaExpression).Body; } } if (descExp == null) { var sourceProperty = sourceType.GetProperty(property.Name, BindingFlags.Public | BindingFlags.Instance); if (sourceProperty == null || !sourceProperty.CanRead || !property.CanWrite) { continue; } descExp = Expression.MakeMemberAccess(parExp, sourceProperty); if (property.PropertyType != sourceProperty.PropertyType) { descExp = Expression.Call(null, MthToType, Expression.Convert(descExp, typeof(object)), Expression.Constant(property.PropertyType), Expression.Constant(null), Expression.Constant(null, typeof(ConvertMapper))); descExp = Expression.Convert(descExp, property.PropertyType); } } bindings.Add(Expression.Bind(property, descExp)); } catch { continue; } } }
private static void GetGeneralMemberAssignments(object source, object target, Type sourceType, Type targetType, ParameterExpression sourceParExp, ParameterExpression targetParExp, List <BinaryExpression> assignments, ConvertMapper mapper) { foreach (var property in targetType.GetProperties(BindingFlags.Public | BindingFlags.Instance)) { try { if (source is ILazyManager lazyMgr && !lazyMgr.IsValueCreated(property.Name)) { continue; } Expression sourceExp = null; //在映射器里查找转换表达式 if (mapper != null) { sourceExp = mapper.GetMapExpression(property); if (sourceExp != null) { sourceExp = (ExpressionReplacer.Replace(sourceExp, sourceParExp) as LambdaExpression).Body; } } if (sourceExp == null) { var sourceProperty = sourceType.GetProperty(property.Name, BindingFlags.Public | BindingFlags.Instance); if (sourceProperty == null || !sourceProperty.CanRead || !property.CanWrite) { continue; } sourceExp = GetPropertyExpression(sourceParExp, target, property, sourceProperty); } var descExp = Expression.MakeMemberAccess(targetParExp, property); assignments.Add(Expression.Assign(descExp, sourceExp)); } catch { continue; } } }