예제 #1
0
        /// <summary>
        /// Maps a member to a CSV field.
        /// </summary>
        /// <param name="expression">The member to map.</param>
        /// <param name="useExistingMap">If true, an existing map will be used if available.
        /// If false, a new map is created for the same member.</param>
        /// <returns>The member mapping.</returns>
        public virtual MemberMap <TClass, TMember> Map <TMember>(Expression <Func <TClass, TMember> > expression, bool useExistingMap = true)
        {
            var stack = ReflectionHelper.GetMembers(expression);

            if (stack.Count == 0)
            {
                throw new InvalidOperationException("No members were found in expression '{expression}'.");
            }

            ClassMap   currentClassMap = this;
            MemberInfo member;

            if (stack.Count > 1)
            {
                // We need to add a reference map for every sub member.
                while (stack.Count > 1)
                {
                    member = stack.Pop();
                    Type mapType;
                    var  property = member as PropertyInfo;
                    var  field    = member as FieldInfo;
                    if (property != null)
                    {
                        mapType = typeof(DefaultClassMap <>).MakeGenericType(property.PropertyType);
                    }
                    else if (field != null)
                    {
                        mapType = typeof(DefaultClassMap <>).MakeGenericType(field.FieldType);
                    }
                    else
                    {
                        throw new InvalidOperationException("The given expression was not a property or a field.");
                    }

                    var referenceMap = currentClassMap.References(mapType, member);
                    currentClassMap = referenceMap.Data.Mapping;
                }
            }

            // Add the member map to the last reference map.
            member = stack.Pop();

            return((MemberMap <TClass, TMember>)currentClassMap.Map(typeof(TClass), member, useExistingMap));
        }
#pragma warning disable CS0693 // Type parameter has the same name as the type parameter from outer type
        public IHasMapOptions <TClass, TMember> Map <TMember>(Expression <Func <TClass, TMember> > expression, bool useExistingMap = true)
        {
            return(new MemberMapBuilder <TClass, TMember>(classMap, classMap.Map(expression, useExistingMap)));
        }