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