static List <IValueSetter> PrepareValueSetters(Type type, IDataReader reader, EntityMemberMapper mapper) { List <IValueSetter> memberSetters = new List <IValueSetter>(reader.FieldCount); MemberInfo[] properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetProperty); MemberInfo[] fields = type.GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetField); List <MemberInfo> members = new List <MemberInfo>(properties.Length + fields.Length); members.AddRange(properties); members.AddRange(fields); TypeDescriptor typeDescriptor = EntityTypeContainer.TryGetDescriptor(type); for (int i = 0; i < reader.FieldCount; i++) { string name = reader.GetName(i); MemberInfo mapMember = TryGetMapMember(members, name, typeDescriptor); if (mapMember == null) { continue; } IMRM mMapper = mapper.TryGetMappingMemberMapper(mapMember); if (mMapper == null) { continue; } MappingMemberBinder memberBinder = new MappingMemberBinder(mMapper, i); memberSetters.Add(memberBinder); } return(memberSetters); }
static List <IValueSetter> PrepareValueSetters(Type type, IDataReader reader, EntityMemberMapper mapper) { List <IValueSetter> memberSetters = new List <IValueSetter>(reader.FieldCount); MemberInfo[] properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetProperty); MemberInfo[] fields = type.GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetField); List <MemberInfo> members = new List <MemberInfo>(properties.Length + fields.Length); members.AddRange(properties); members.AddRange(fields); for (int i = 0; i < reader.FieldCount; i++) { string name = reader.GetName(i); var member = members.Where(a => a.Name == name).FirstOrDefault(); if (member == null) { member = members.Where(a => string.Equals(a.Name, name, StringComparison.OrdinalIgnoreCase)).FirstOrDefault(); if (member == null) { continue; } } IMRM mMapper = mapper.TryGetMappingMemberMapper(member); if (mMapper == null) { continue; } MappingMemberBinder memberBinder = new MappingMemberBinder(mMapper, i); memberSetters.Add(memberBinder); } return(memberSetters); }
public IObjectActivator CreateObjectActivator(IDbContext dbContext) { EntityMemberMapper mapper = this.ConstructorDescriptor.GetEntityMemberMapper(); List <IValueSetter> memberSetters = new List <IValueSetter>(this.Members.Count + this.EntityMembers.Count); foreach (var kv in this.Members) { IMRM mMapper = mapper.TryGetMappingMemberMapper(kv.Key); MappingMemberBinder binder = new MappingMemberBinder(mMapper, kv.Value); memberSetters.Add(binder); } foreach (var kv in this.EntityMembers) { Action <object, object> del = mapper.TryGetNavigationMemberSetter(kv.Key); IObjectActivator memberActivtor = kv.Value.CreateObjectActivator(); NavigationMemberBinder binder = new NavigationMemberBinder(del, memberActivtor); memberSetters.Add(binder); } Func <IDataReader, ReaderOrdinalEnumerator, ObjectActivatorEnumerator, object> instanceCreator = this.ConstructorDescriptor.GetInstanceCreator(); List <int> readerOrdinals = this.ConstructorParameters.Select(a => a.Value).ToList(); List <IObjectActivator> objectActivators = this.ConstructorEntityParameters.Select(a => a.Value.CreateObjectActivator()).ToList(); ObjectActivator ret; if (dbContext != null) { ret = new ObjectActivatorWithTracking(instanceCreator, readerOrdinals, objectActivators, memberSetters, this.CheckNullOrdinal, dbContext); } else { ret = new ObjectActivator(instanceCreator, readerOrdinals, objectActivators, memberSetters, this.CheckNullOrdinal); } return(ret); }