private bool MapDestinationPropertyToSource(LinkedList <MemberInfo> resolvers, TypeInfo sourceType, string nameToSearch, IMappingOptions mappingOptions) { if (string.IsNullOrEmpty(nameToSearch)) { return(true); } var sourceProperties = sourceType.GetPublicReadAccessors(); var sourceNoArgMethods = sourceType.GetPublicNoArgMethods(); var sourceNoArgExtensionMethods = sourceType.GetPublicNoArgExtensionMethods(mappingOptions.SourceExtensionMethodSearch); MemberInfo resolver = FindTypeMember(sourceProperties, sourceNoArgMethods, sourceNoArgExtensionMethods, nameToSearch, mappingOptions); bool foundMatch = resolver != null; if (foundMatch) { resolvers.AddLast(resolver); } else { string[] matches = mappingOptions.DestinationMemberNamingConvention.SplittingExpression .Matches(nameToSearch) .Cast <Match>() .Select(m => m.Value) .ToArray(); for (int i = 1; (i <= matches.Length) && (!foundMatch); i++) { NameSnippet snippet = CreateNameSnippet(matches, i, mappingOptions); var valueResolver = FindTypeMember(sourceProperties, sourceNoArgMethods, sourceNoArgExtensionMethods, snippet.First, mappingOptions); if (valueResolver != null) { resolvers.AddLast(valueResolver); foundMatch = MapDestinationPropertyToSource(resolvers, GetTypeInfo(valueResolver.GetMemberType()), snippet.Second, mappingOptions); if (!foundMatch) { resolvers.RemoveLast(); } } } } return(foundMatch); }
public string[] GetUnmappedPropertyNames() { var autoMappedProperties = _propertyMaps.Where(pm => pm.IsMapped()) .Select(pm => pm.DestinationProperty.Name); var inheritedProperties = _inheritedMaps.Where(pm => pm.IsMapped()) .Select(pm => pm.DestinationProperty.Name); IEnumerable <string> properties; if (ConfiguredMemberList == MemberList.Destination) { properties = _destinationType.GetPublicWriteAccessors() .Select(p => p.Name) .Except(autoMappedProperties) .Except(inheritedProperties); } else { var redirectedSourceMembers = _propertyMaps .Where(pm => pm.IsMapped()) .Where(pm => pm.CustomExpression != null) .Where(pm => pm.SourceMember != null) .Select(pm => pm.SourceMember.Name); var ignoredSourceMembers = _sourceMemberConfigs .Where(smc => smc.IsIgnored()) .Select(pm => pm.SourceMember.Name); properties = _sourceType.GetPublicReadAccessors() .Select(p => p.Name) .Except(autoMappedProperties) .Except(inheritedProperties) .Except(redirectedSourceMembers) .Except(ignoredSourceMembers) ; } return(properties.Where(memberName => !IgnorePropertiesStartingWith.Any(memberName.StartsWith)).ToArray()); }
private bool MapDestinationPropertyToSource(LinkedList<MemberInfo> resolvers, TypeInfo sourceType, string nameToSearch, IMappingOptions mappingOptions) { if (string.IsNullOrEmpty(nameToSearch)) return true; var sourceProperties = sourceType.GetPublicReadAccessors(); var sourceNoArgMethods = sourceType.GetPublicNoArgMethods(); var sourceNoArgExtensionMethods = sourceType.GetPublicNoArgExtensionMethods(); MemberInfo resolver = FindTypeMember(sourceProperties, sourceNoArgMethods, sourceNoArgExtensionMethods, nameToSearch, mappingOptions); bool foundMatch = resolver != null; if (foundMatch) { resolvers.AddLast(resolver); } else { string[] matches = mappingOptions.DestinationMemberNamingConvention.SplittingExpression .Matches(nameToSearch) .Cast<Match>() .Select(m => m.Value) .ToArray(); for (int i = 1; (i <= matches.Length) && (!foundMatch); i++) { NameSnippet snippet = CreateNameSnippet(matches, i, mappingOptions); var valueResolver = FindTypeMember(sourceProperties, sourceNoArgMethods, sourceNoArgExtensionMethods, snippet.First, mappingOptions); if (valueResolver != null) { resolvers.AddLast(valueResolver); foundMatch = MapDestinationPropertyToSource(resolvers, GetTypeInfo(valueResolver.GetMemberType(), mappingOptions.SourceExtensionMethods), snippet.Second, mappingOptions); if (!foundMatch) { resolvers.RemoveLast(); } } } } return foundMatch; }