예제 #1
0
 public MappingContext(PropertyOrFieldInfo source, PropertyOrFieldInfo dest, int depth, IMemberMapper mapper)
 {
     Source = source;
       Destination = dest;
       Depth = depth;
       Mapper = mapper;
 }
예제 #2
0
        public bool IsMemberIgnored(Type sourceType, PropertyOrFieldInfo destinationProperty)
        {
            if (mapper.Options.Conventions.IgnoreMemberAttributeShouldBeRespected)
              {
            var ignoreAttribute = destinationProperty.GetCustomAttributes(typeof(IgnoreMemberAttribute), false).SingleOrDefault() as IgnoreMemberAttribute;

            if (ignoreAttribute != null)
            {
              var ignore = true;

              if (!string.IsNullOrEmpty(ignoreAttribute.Profile))
              {
            ignore &= ignoreAttribute.Profile == mapper.Profile;
              }

              if (ignoreAttribute.WhenSourceTypeIs != null)
              {
            ignore &= ignoreAttribute.WhenSourceTypeIs == sourceType;
              }

              if (ignore) return true;
            }
              }
              return false;
        }
예제 #3
0
        public PropertyOrFieldInfo GetMatchingSourceMember(PropertyOrFieldInfo destinationProperty)
        {
            PropertyOrFieldInfo sourceProperty;

              SourceMembers.TryGetValue(destinationProperty.Name, out sourceProperty);

              return sourceProperty;
        }
예제 #4
0
        public LambdaExpression GetConversionFunction(PropertyOrFieldInfo source, PropertyOrFieldInfo destination)
        {
            LambdaExpression conversion;

            this.conversionFunctions.TryGetValue(new ConversionFunctionKey(source, destination), out conversion);

            return(conversion);
        }
        internal static LambdaExpression Bind(Type sourceType, PropertyOrFieldInfo member, LambdaExpression conversion, LambdaExpression customMapping = null)
        {
            var parameterToReplace = conversion.Parameters.Single();

              var newParameter = Expression.Parameter(sourceType, "p");

              var accessMember = Expression.MakeMemberAccess(newParameter, member);

              var visitor = new ParameterVisitor(parameterToReplace, accessMember);

              var newBody= visitor.Visit(conversion.Body);

              return Expression.Lambda(newBody, newParameter);
        }
예제 #6
0
 public ConversionFunctionKey(PropertyOrFieldInfo source, PropertyOrFieldInfo dest)
 {
     if (source != null)
     {
         this.sourceAsString = source.DeclaringType.FullName + "." + source.Name;
     }
     else
     {
         this.sourceAsString = "";
     }
     if (dest != null)
     {
         this.destinationAsString = dest.DeclaringType.FullName + "." + dest.Name;
     }
     else
     {
         this.destinationAsString = "";
     }
 }
예제 #7
0
        public Expression GetExpressionForMember(PropertyOrFieldInfo member)
        {
            foreach (var m in this.Members)
            {
                if (member.Equals(m.Member))
                {
                    return(m.Expression);
                }
            }

            Expression expression = null;

            foreach (var cm in this.CustomMappings)
            {
                expression = cm.GetExpressionForMember(member);
            }

            return(expression);
        }
예제 #8
0
        public void AddExpressionForMember(PropertyOrFieldInfo member, Expression expression)
        {
            var cm = GetCustomMappingForMember(member);

            if (cm != null)
            {
                lock (cm)
                {
                    cm.Members.Add(new MemberExpressionTuple
                    {
                        Member     = member,
                        Expression = expression
                    });
                }
            }
            else
            {
            }
        }
예제 #9
0
        public Expression GetExpressionForMember(PropertyOrFieldInfo member)
        {
            foreach (var m in this.Members)
              {
            if (member.Equals(m.Member))
            {
              return m.Expression;
            }
              }

              Expression expression = null;

              foreach (var cm in this.CustomMappings)
              {
            expression = cm.GetExpressionForMember(member);
              }

              return expression;
        }
예제 #10
0
        private CustomMapping GetCustomMappingForMember(PropertyOrFieldInfo member)
        {
            if (!this.HasCustomMappingForMember(member))
            {
                foreach (var cm in this.CustomMappings)
                {
                    var mapping = cm.GetCustomMappingForMember(member);

                    if (mapping == null)
                    {
                        return(mapping);
                    }
                }
                return(null);
            }
            else
            {
                return(this);
            }
        }
예제 #11
0
        public ProposedHierarchicalMapping ProposeHierarchicalMapping(PropertyOrFieldInfo destinationMember)
        {
            var split = CamelCaseHelper.SplitOnCamelCase(destinationMember.Name);

              if (split.Count <= 1)
              {
            return null;
              }

              var sourceMembers = SourceMembers;

              var memberStack = new List<PropertyOrFieldInfo>();

              var applies = GetMemberOnType(sourceType, split, 0, memberStack);

              if (applies)
              {
            return new ProposedHierarchicalMapping(memberStack);
              }

              return null;
        }
예제 #12
0
        private bool HasCustomMappingForMember(PropertyOrFieldInfo member)
        {
            var match = this.Members.FirstOrDefault(m => m.Equals(member));

            return(match != null);
        }
예제 #13
0
 public void AddConversionFunction(PropertyOrFieldInfo source, PropertyOrFieldInfo destination, LambdaExpression conversion)
 {
     this.conversionFunctions[new ConversionFunctionKey(source, destination)] = conversion;
 }
예제 #14
0
 private string GetParameterName(PropertyOrFieldInfo member)
 {
     return member.Name;
 }
예제 #15
0
 private string GetParameterName(PropertyOrFieldInfo member)
 {
     return member.Name + "#" + currentID++;
 }