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); }
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); }
public static void FastSetMemberValue(this MemberInfo propertyOrField, object obj, object value) { MemberValueSetter setter = MemberValueSetterContainer.GetMemberValueSetter(propertyOrField); setter(obj, value); return; }
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); }
public void SetValue(object instance, object value) { if (null == this._valueSetter) { this._valueSetter = MemberValueSetterContainer.GetMemberValueSetter(this.Definition.Property); } this._valueSetter(instance, value); }
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); }
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); }
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); }
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); }
public ComplexMemberBinder(MemberValueSetter setter, IObjectActivator activtor) : base(setter, activtor) { }
public MRM2(MemberInfo member, MappingType mappingType) { this._mappingType = mappingType; this._valueSetter = MemberValueSetterContainer.GetMemberValueSetter(member); }
public MemberBinder(MemberValueSetter setter, IObjectActivator activtor) { this._setter = setter; this._activtor = activtor; }