public void Map(ref MapperInfo _Info, ref object from, ref object to) { var dic = from as IDictionary<string, TValue>; IDictionary<string, TValue> tmpDic = dic; if (_Info.IgnoreCase) tmpDic = new Dictionary<string, TValue>(dic, _Info.IgnoreCase ? StringComparer.InvariantCultureIgnoreCase : StringComparer.InvariantCulture); var tmpMembers = _Info .DestinationMembers .Where(m => m.MemberType == MemberTypes.Field || m.MemberType == MemberTypes.Property) .ToArray(); var keys = tmpDic.Keys.ToList(); var ms = tmpMembers; foreach (var key in keys) { var tmpValue = tmpDic[key]; var m = ms.FirstOrDefault(s => string.Equals(s.Name, key, StringComparison.OrdinalIgnoreCase)); if (m != null) BindProperty(ref to, tmpValue, m); else BindSubProperty(ref to, key, tmpValue); } tmpDic.Clear(); tmpDic = null; }
protected MapperBase(Type fromType, Type toType) { Key = fromType.FullName + "->" + toType.FullName; _Info = new MapperInfo { From = fromType , To = toType , Key = this.Key }; }
public MemberMapping(MapperInfo mapperInfo, MemberModel from, MemberModel to, string fromMemberPath) { _Info = mapperInfo; From = from; To = to; from.GetMember = from.Member.GetGetter(); to.SetMember = to.Member.GetSetter(); //FromMemberPath = fromMemberPath; Key = From.Type.FullName + "->" + To.Type.FullName; if (to.Type != from.Type && !to.Type.IsAssignableFrom(from.Type)) { MemberMapper = CreateMapperMethod.MakeGenericMethod(from.Type, to.Type).Invoke(Mapper.Current, null) as IMapper; } if (!string.IsNullOrEmpty(fromMemberPath)) { var members = fromMemberPath.Split('.'); var length = members.Length; if (length > 1) { MemberPaths = new Getter[length - 1]; var subObjectType = from.Type; for (int i = 1; i < length; i++) { var subMember = subObjectType .GetMember(members[i]) .FirstOrDefault(); if (subMember == null) { break; } MemberPaths[i - 1] = subMember.GetGetter(); subObjectType = subMember.GetMemberType(); } } } }