public static MemberExpression GetMember(LambdaExpression expression) { var visitor = new MemberExpessionVisitor(expression.Parameters[0]); visitor.Visit(expression); return(visitor.Result); }
private static string CreateEntryDescription(BuilderConfigurationEntry entry, Type sourceType, Type targetType) { var sourceTypeName = sourceType.Name; var targetTypeName = targetType.Name; if (entry.MapType == MapType.MapAll) { return(string.Format("MapAll: {0}->{1}", sourceTypeName, targetTypeName)); } if (entry.MapType == MapType.MapFunction) { return(string.Format("MappingFunction({0}, {1})", sourceTypeName, targetTypeName)); } if (entry.MapType == MapType.MapIgnore) { var sourceTargetEntry = (BuilderConfigurationIgnoreEntry)entry; var targetMember = MemberExpessionVisitor.GetMember(sourceTargetEntry.TargetExpression); var result = string.Format("Ignored: -> {0}.{1}", targetTypeName, targetMember == null ? "?" : targetMember.Member.Name); return(result); } else { //Entry MUST be BuilderConfigurationSourceTargetExpressionEntry for any other MapTypes... var sourceTargetEntry = (BuilderConfigurationSourceTargetExpressionEntry)entry; var sourceMember = MemberExpessionVisitor.GetMember(sourceTargetEntry.SourceExpression); var targetMember = MemberExpessionVisitor.GetMember(sourceTargetEntry.TargetExpression); var result = string.Format("{0}.{1} -> {2}.{3}", sourceTypeName, sourceMember == null ? "?" : sourceMember.Member.Name, targetTypeName, targetMember == null ? "?" : targetMember.Member.Name ); return(result); } }
public MappingConfiguration Build() { var configEntries = new List <MappingConfigurationEntry>(); //Create a copy of builder entries, and add all MapAll's to it... (remove all MapAlls from the copy) var mapAllResults = new List <BuilderConfigurationEntry>(); var mapAllErrors = new List <string>(); foreach (var entry in _builderEntries.Where(x => x.MapType == MapType.MapAll)) { mapAllResults.AddRange(MapAllHelper.MapAll(_builderEntries, _conversions, entry.SourceType, entry.TargetType, mapAllErrors)); } if (mapAllErrors.Any()) { throw new MappingException(string.Format("The following error(s) occurred while building the mapper:\r\n{0}", string.Join("\r\n", mapAllErrors))); } //Add the extra entries from MappingAll to a temporary list. var builderEntries = _builderEntries.ToList(); builderEntries.AddRange(mapAllResults); foreach (var entry in builderEntries) { var sourceType = entry.SourceType; var targetType = entry.TargetType; var entryDescription = CreateEntryDescription(entry, sourceType, targetType); var hasDependency = entry.HasDependencyArgument; if (entry.MapType == MapType.MapProperty) { var sourceTargetEntry = (BuilderConfigurationSourceTargetExpressionEntry)entry; var action = CreateMappingAction(sourceTargetEntry.SourceExpression, sourceTargetEntry.TargetExpression, sourceTargetEntry.Converter); var configEntry = new MappingConfigurationPropertyEntry( sourceType, targetType, entryDescription, action, hasDependency ? sourceTargetEntry.SourceExpression.Parameters[1].Type : null, sourceTargetEntry.NamedResolutions); configEntries.Add(configEntry); } else if (entry.MapType == MapType.MapObject) { var sourceTargetEntry = (BuilderConfigurationSourceTargetExpressionEntry)entry; var targetMember = MemberExpessionVisitor.GetMember(sourceTargetEntry.TargetExpression); if (targetMember == null) { throw new MappingException("Could not find object type on target"); } var configEntry = new MappingConfigurationObjectEntry( sourceType, targetType, entryDescription, CreateGetterFunction(sourceTargetEntry.SourceExpression), CreateGetterFunction(sourceTargetEntry.TargetExpression), CreateObjectSetterMappingAction(sourceTargetEntry.TargetExpression), sourceTargetEntry.TargetExpression.ReturnType); configEntries.Add(configEntry); } else if (entry.MapType == MapType.MapCollection) { var sourceTargetEntry = (BuilderConfigurationSourceTargetExpressionEntry)entry; var targetMember = MemberExpessionVisitor.GetMember(sourceTargetEntry.TargetExpression); if (targetMember == null) { throw new MappingException("Could not find collection type on target"); } var configEntry = new MappingConfigurationCollectionEntry( sourceType, targetType, entryDescription, CreateGetterFunction(sourceTargetEntry.SourceExpression), CreateGetterFunction(sourceTargetEntry.TargetExpression), CreateObjectSetterMappingAction(sourceTargetEntry.TargetExpression), targetMember.Type); configEntries.Add(configEntry); } else if (entry.MapType == MapType.MapFunction) { var functionEntry = (BuilderConfigurationFunctionMapEntry)entry; var configEntry = new MappingConfigurationFunctionEntry( sourceType, targetType, entryDescription, functionEntry.Action, functionEntry.DependencyTupleType, functionEntry.NamedResolutions ); configEntries.Add(configEntry); } } return(new MappingConfiguration(configEntries)); }