/// <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))); }