protected SerializationContext(object instance,
                                Func <PropertyInfo, bool> propertySelector = null, Func <FieldInfo, bool> fieldSelector = null)
 {
     if (instance == null)
     {
         throw new ArgumentNullException(nameof(instance));
     }
     _instance = instance;
     _members  = ModelingHelpers.GetCompatibleModelValueMembers(instance.GetType(), propertySelector, fieldSelector);
 }
Пример #2
0
        public static List <Mapping.MemberMapInfo> GetMemberMappings(
            Type destinationType,
            Type sourceType,
            BindingFlags destinationBindingFlags,
            BindingFlags sourceBindingFlags,
            IMapperMemberMatchingStrategy mapperMemberMatchingStrategy,
            IEnumerable <IModelValueMemberFilter> destinationFilters,
            IEnumerable <IModelValueMemberFilter> sourceFilters,
            MappingType mappingType
            )
        {
            if (destinationType == null)
            {
                throw new ArgumentNullException(nameof(destinationType));
            }
            if (sourceType == null)
            {
                throw new ArgumentNullException(nameof(sourceType));
            }
            if (mapperMemberMatchingStrategy == null)
            {
                throw new ArgumentNullException(nameof(mapperMemberMatchingStrategy));
            }

            var result = new List <Mapping.MemberMapInfo>();

            IDictionary <string, IModelValueMemberInfo> destinationMembers =
                ModelingHelpers.GetModelFields(destinationType, destinationBindingFlags | BindingFlags.SetField)
                .Union(
                    ModelingHelpers.GetModelProperties(destinationType,
                                                       destinationBindingFlags | BindingFlags.SetProperty)
                    )
                .ToDictionary(key => key.Name);

            IDictionary <string, IModelValueMemberInfo> sourceMembers =
                ModelingHelpers.GetModelFields(destinationType, sourceBindingFlags | BindingFlags.GetField)
                .Union(
                    ModelingHelpers.GetModelProperties(destinationType,
                                                       sourceBindingFlags | BindingFlags.GetProperty)
                    )
                .ToDictionary(key => key.Name);

            if (destinationFilters != null)
            {
                foreach (var filter in destinationFilters)
                {
                    destinationMembers = filter.Filter(destinationMembers);
                }
            }

            if (sourceFilters != null)
            {
                foreach (var filter in sourceFilters)
                {
                    sourceMembers = filter.Filter(sourceMembers);
                }
            }

            var convertedSourceMembers = mapperMemberMatchingStrategy.ProcessSourceMemberNames(sourceMembers);

            foreach (var destMember in destinationMembers)
            {
                var destName = destMember.Key;
                var destInfo = destMember.Value;

                if (mapperMemberMatchingStrategy.TryFindMatchingMember(
                        destName,
                        destInfo,
                        convertedSourceMembers,
                        out var sourceMemberName,
                        out var sourceMemberInfo
                        ))
                {
                    result.Add(GetSourceToDestinationMap(
                                   destName,
                                   destInfo,
                                   sourceMemberName,
                                   sourceMemberInfo
                                   ));
                }