private void GenerateNewMemberWithPrivateSetter(MemberHandler pi, ILBuilder processor, ILBuilder ctorBuilder) { var dt = typeof(Action <,>).MakeGenericType(_model, pi.MemberType); var df = _result.DefineField("$" + pi.MemberInfo.Name, dt, fieldFlag); ctorBuilder.LoadArg(0); ctorBuilder.LoadToken(dt); ctorBuilder.Call(getTypeFromHandle); ctorBuilder.LoadLoc(0); ctorBuilder.LoadString(pi.MemberInfo.Name); ctorBuilder.CallVirtual(getProperty); ctorBuilder.LoadInt(1); ctorBuilder.CallVirtual(getSetMethod); ctorBuilder.Call(createDelegate); ctorBuilder.Cast(dt); ctorBuilder.SetField(df); processor.LoadArg(0); processor.LoadField(df); processor.LoadArg(1); GenerateNewMember(pi, processor); var invoke = dt.GetMethod("Invoke"); processor.CallVirtual(invoke); }
private void GenerateNewMember(MemberHandler pi, ILBuilder processor) { processor.LoadArg(1); ConstructorInfo ci1; var ft = pi.MemberType; if (pi.Is.HasOne || pi.Is.HasMany || pi.Is.HasAndBelongsToMany) { ci1 = ft.GetConstructor(new Type[] { typeof(DbObjectSmartUpdate), typeof(string), typeof(string) }); if (string.IsNullOrEmpty(pi.OrderByString)) { processor.LoadString("Id"); } else { processor.LoadString(pi.OrderByString); } } else { ci1 = ft.GetConstructor(new Type[] { typeof(DbObjectSmartUpdate), typeof(string) }); } if (pi.Is.HasOne || pi.Is.HasMany) { processor.LoadString(GetBelongsToColumnName(pi)); } else if (pi.Is.HasAndBelongsToMany) { processor.LoadString(GetHasManyAndBelongsToColumnName(pi)); } else { processor.LoadString(pi.Name); } processor.NewObj(ci1); }
private void GenerateSetValuesForSelectDirectDirect(bool noLazy) { var methodName = noLazy ? "SetValuesForSelectDirectNoLazy" : "SetValuesForSelectDirect"; var method = _result.DefineMethod(methodName, MethodAttr, null, new Type[] { listKeyValuePairStringStringType }); _result.DefineMethodOverride(method, noLazy ? handlerBaseSetValuesForSelectDirectNoLazy : handlerBaseSetValuesForSelectDirect); var processor = new ILBuilder(method.GetILGenerator()); foreach (var f in _info.Members) { if (!f.Is.HasOne && !f.Is.HasMany && !f.Is.HasAndBelongsToMany) { if (noLazy || !f.Is.LazyLoad) { processor.LoadArg(1); processor.LoadString(f.Name); if (f.Name != f.MemberInfo.Name) { processor.LoadString(f.MemberInfo.Name); } else { processor.LoadNull(); } processor.NewObj(keyValuePairStringStringCtor); processor.CallVirtual(listKeyValuePairStringStringAdd); } } } processor.Return(); }
private void GenerateLoadRelationValues(bool useIndex, bool noLazy) { int index = _info.SimpleMembers.Length; string methodName = useIndex ? "LoadRelationValuesByIndex" : "LoadRelationValuesByName"; if (noLazy) { methodName = methodName + "NoLazy"; } var method = _result.DefineMethod(methodName, MethodAttr, null, new Type[] { objectType, iDataReaderType }); _result.DefineMethodOverride(method, useIndex ? (noLazy ? handlerBaseLoadRelationValuesByIndexNoLazy : handlerBaseLoadRelationValuesByIndex) : (noLazy ? handlerBaseLoadRelationValuesByNameNoLazy : handlerBaseLoadRelationValuesByName)); var processor = new ILBuilder(method.GetILGenerator()); if (_info.RelationMembers.Length > 0) { // User u = (User)o; processor.DeclareLocal(_model); processor.LoadArg(1).Cast(_model).SetLoc(0); // set values foreach (var f in _info.RelationMembers) { if (f.Is.LazyLoad) { if (noLazy) { processor.LoadLoc(0); processor.GetMember(f); processor.LoadArg(2); if (useIndex) { processor.LoadInt(index++).CallVirtual(dataReaderMethodInt); } else { processor.LoadString(f.Name).CallVirtual(dataReaderMethodString); } processor.LoadInt(0); processor.CallVirtual(lazyLoadingInterfaceWrite); } } else if (f.Is.BelongsTo) { processor.LoadLoc(0); processor.GetMember(f); processor.LoadArg(2); if (useIndex) { processor.LoadInt(index++).CallVirtual(dataReaderMethodInt); } else { processor.LoadString(f.Name).CallVirtual(dataReaderMethodString); } processor.CallVirtual(belongsToInterfaceSetForeignKey); } } } processor.Return(); }