Example #1
0
        void Init()
        {
            Type t       = this.Type;
            var  members = t.GetMembers(BindingFlags.Public | BindingFlags.Instance);
            Dictionary <MemberInfo, MRMTuple> mappingMemberMappers           = new Dictionary <MemberInfo, MRMTuple>();
            Dictionary <MemberInfo, Lazy <MemberValueSetter> > memberSetters = new Dictionary <MemberInfo, Lazy <MemberValueSetter> >();

            foreach (var member in members)
            {
                if (!member.HasPublicSetter())
                {
                    continue;
                }

                //只支持公共属性和字段
                Type memberType = member.GetMemberType();

                memberSetters.Add(member, new Lazy <MemberValueSetter>(() =>
                {
                    MemberValueSetter valueSetter = MemberValueSetterContainer.GetMemberValueSetter(member);
                    return(valueSetter);
                }, LazyThreadSafetyMode.ExecutionAndPublication));

                Infrastructure.MappingType mappingType;
                if (MappingTypeSystem.IsMappingType(memberType, out mappingType))
                {
                    MRMTuple mrmTuple = MRMHelper.CreateMRMTuple(member, mappingType);
                    mappingMemberMappers.Add(member, mrmTuple);
                }
            }

            this._mappingMemberMappers = PublicHelper.Clone(mappingMemberMappers);
            this._memberSetters        = PublicHelper.Clone(memberSetters);
        }
Example #2
0
        public void SetValue(object instance, object value)
        {
            if (null == this._valueSetter)
            {
                if (Monitor.TryEnter(this))
                {
                    try
                    {
                        if (null == this._valueSetter)
                        {
                            this._valueSetter = MemberValueSetterContainer.GetMemberValueSetter(this.Definition.Property);
                        }
                    }
                    finally
                    {
                        Monitor.Exit(this);
                    }
                }
                else
                {
                    this.Definition.Property.SetMemberValue(instance, value);
                    return;
                }
            }

            this._valueSetter(instance, value);
        }
Example #3
0
        public static void FastSetMemberValue(this MemberInfo propertyOrField, object obj, object value)
        {
            MemberValueSetter setter = MemberValueSetterContainer.GetMemberValueSetter(propertyOrField);

            setter(obj, value);
            return;
        }
Example #4
0
        List <IMemberBinder> CreateMemberBinders(IDbContext dbContext)
        {
            ObjectMemberMapper   mapper        = this.ConstructorDescriptor.GetEntityMemberMapper();
            List <IMemberBinder> memberBinders = new List <IMemberBinder>(this.PrimitiveMembers.Count + this.ComplexMembers.Count + this.CollectionMembers.Count);

            foreach (var kv in this.PrimitiveMembers)
            {
                MRMTuple mrmTuple            = mapper.GetMappingMemberMapper(kv.Key);
                PrimitiveMemberBinder binder = new PrimitiveMemberBinder(kv.Key, mrmTuple, kv.Value);
                memberBinders.Add(binder);
            }

            foreach (var kv in this.ComplexMembers)
            {
                MemberValueSetter   setter         = mapper.GetMemberSetter(kv.Key);
                IObjectActivator    memberActivtor = kv.Value.CreateObjectActivator(dbContext);
                ComplexMemberBinder binder         = new ComplexMemberBinder(setter, memberActivtor);
                memberBinders.Add(binder);
            }

            foreach (var kv in this.CollectionMembers)
            {
                MemberValueSetter      setter         = mapper.GetMemberSetter(kv.Key);
                IObjectActivator       memberActivtor = kv.Value.CreateObjectActivator(dbContext);
                CollectionMemberBinder binder         = new CollectionMemberBinder(setter, memberActivtor);
                memberBinders.Add(binder);
            }

            return(memberBinders);
        }
        public static MemberValueSetter GetMemberValueSetter(MemberInfo memberInfo)
        {
            MemberValueSetter setter = Cache.GetOrAdd(memberInfo, member =>
            {
                return(DelegateGenerator.CreateValueSetter(member));
            });

            return(setter);
        }
Example #6
0
        public void SetValue(object instance, object value)
        {
            if (null == this._valueSetter)
            {
                this._valueSetter = MemberValueSetterContainer.GetMemberValueSetter(this.Definition.Property);
            }

            this._valueSetter(instance, value);
        }
Example #7
0
        public static MemberValueSetter CreateValueSetter(PropertyInfo propertyInfo)
        {
            var p        = Expression.Parameter(typeof(object), "instance");
            var pValue   = Expression.Parameter(typeof(object), "value");
            var instance = Expression.Convert(p, propertyInfo.DeclaringType);
            var value    = Expression.Convert(pValue, propertyInfo.PropertyType);

            var pro      = Expression.Property(instance, propertyInfo);
            var setValue = Expression.Assign(pro, value);

            Expression body = setValue;

            var lambda            = Expression.Lambda <MemberValueSetter>(body, p, pValue);
            MemberValueSetter ret = lambda.Compile();

            return(ret);
        }
Example #8
0
        public static MemberValueSetter CreateValueSetter(FieldInfo fieldInfo)
        {
            var p        = Expression.Parameter(typeof(object), "instance");
            var pValue   = Expression.Parameter(typeof(object), "value");
            var instance = Expression.Convert(p, fieldInfo.DeclaringType);
            var value    = Expression.Convert(pValue, fieldInfo.FieldType);

            var field    = Expression.Field(instance, fieldInfo);
            var setValue = Expression.Assign(field, value);

            Expression body = setValue;

            var lambda            = Expression.Lambda <MemberValueSetter>(body, p, pValue);
            MemberValueSetter ret = lambda.Compile();

            return(ret);
        }
Example #9
0
        public static MemberValueSetter GetMemberValueSetter(MemberInfo memberInfo)
        {
            MemberValueSetter setter = null;

            if (!Cache.TryGetValue(memberInfo, out setter))
            {
                lock (memberInfo)
                {
                    if (!Cache.TryGetValue(memberInfo, out setter))
                    {
                        setter = DelegateGenerator.CreateValueSetter(memberInfo);
                        Cache.GetOrAdd(memberInfo, setter);
                    }
                }
            }

            return(setter);
        }
Example #10
0
        public static MemberValueSetter CreateValueSetter(MemberInfo propertyOrField)
        {
            ParameterExpression p        = Expression.Parameter(typeof(object), "instance");
            ParameterExpression pValue   = Expression.Parameter(typeof(object), "value");
            Expression          instance = null;

            if (!propertyOrField.IsStaticMember())
            {
                instance = Expression.Convert(p, propertyOrField.DeclaringType);
            }

            var value    = Expression.Convert(pValue, propertyOrField.GetMemberType());
            var setValue = ExpressionExtension.Assign(propertyOrField, instance, value);

            Expression body = setValue;

            var lambda            = Expression.Lambda <MemberValueSetter>(body, p, pValue);
            MemberValueSetter ret = lambda.Compile();

            return(ret);
        }
Example #11
0
 public ComplexMemberBinder(MemberValueSetter setter, IObjectActivator activtor) : base(setter, activtor)
 {
 }
Example #12
0
 public MRM2(MemberInfo member, MappingType mappingType)
 {
     this._mappingType = mappingType;
     this._valueSetter = MemberValueSetterContainer.GetMemberValueSetter(member);
 }
Example #13
0
 public MemberBinder(MemberValueSetter setter, IObjectActivator activtor)
 {
     this._setter   = setter;
     this._activtor = activtor;
 }