private static void SearchMapperProvider(IEnumerable <Assembly> assemblies) { foreach (Assembly assembly in assemblies) { Type[] types = assembly.GetTypes(); for (int i = 0; i < (int)types.Length; i++) { Type type = types[i]; MapperProviderAttribute customAttribute = type.GetTypeInfo().GetCustomAttribute <MapperProviderAttribute>(); if (customAttribute != null && !MapperProvider.MapperProviderType.ContainsKey(customAttribute.Name)) { MapperProvider.MapperProviderType.Add(customAttribute.Name, type); } } } }
public static void CreateMapperMember(object model) { Type type = model.GetType(); List <BaseMapperService.MapperMemberInfo> mapperMemberInfos = null; if (!BaseMapperService.mapperMemberInfo.TryGetValue(type, out mapperMemberInfos)) { lock (BaseMapperService._lock) { if (!BaseMapperService.mapperMemberInfo.TryGetValue(type, out mapperMemberInfos)) { mapperMemberInfos = new List <BaseMapperService.MapperMemberInfo>(); FieldInfo[] fields = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); for (int i = 0; i < (int)fields.Length; i++) { FieldInfo fieldInfo = fields[i]; Type fieldType = fieldInfo.FieldType; TypeInfo typeInfo = fieldType.GetTypeInfo(); if (typeInfo.ImplementedInterfaces.Contains <Type>(typeof(IMapper)) && !typeInfo.IsSubclassOf(typeof(BaseMapper)) && fieldInfo.GetValue(model) == null) { List <ProviderParameterAttribute> list = fieldType.GetCustomAttributes <ProviderParameterAttribute>().ToList <ProviderParameterAttribute>(); MapperProviderAttribute customAttribute = fieldInfo.GetCustomAttribute <MapperProviderAttribute>(); List <ProviderParameterAttribute> providerParameterAttributes = fieldInfo.GetCustomAttributes <ProviderParameterAttribute>().ToList <ProviderParameterAttribute>(); foreach (ProviderParameterAttribute providerParameterAttribute in list) { if (providerParameterAttributes.Exists((ProviderParameterAttribute p) => p.Name == providerParameterAttribute.Name)) { continue; } providerParameterAttributes.Add(providerParameterAttribute); } if (customAttribute != null) { MapperProvider mapperProvider = MapperProvider.CreateProvider(customAttribute.Name); mapperMemberInfos.Add(new BaseMapperService.MapperMemberInfo() { Field = fieldInfo, Type = fieldType, Parameter = list, Provider = mapperProvider }); } else { mapperMemberInfos.Add(new BaseMapperService.MapperMemberInfo() { Field = fieldInfo, Type = fieldType, Parameter = list }); } } } BaseMapperService.mapperMemberInfo.Add(type, mapperMemberInfos); } } } foreach (BaseMapperService.MapperMemberInfo mapperMemberInfo in mapperMemberInfos) { IMapper mapper = BaseMapper.CreateMapper(mapperMemberInfo.Type, mapperMemberInfo.Provider); mapperMemberInfo.Field.SetValue(model, mapper); } }