Esempio n. 1
0
            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);
            }
Esempio n. 3
0
        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);
        }