private void GenerateSetKeyValueDirect() { var method = _result.DefineMethod("SetKeyValueDirect", MethodAttr, null, new Type[] { objectType, objectType }); _result.DefineMethodOverride(method, handlerBaseSetKeyValueDirect); var processor = new ILBuilder(method.GetILGenerator()); if (_info.KeyMembers.Length == 1) { var h = _info.KeyMembers[0]; processor.LoadArg(1).Cast(_model); processor.LoadArg(2); var fh = _info.KeyMembers[0]; if (fh.MemberType == typeof(long)) { processor.Call(convertToInt64); } else if (fh.MemberType == typeof(int)) { processor.Call(convertToInt32); } else if (fh.MemberType == typeof(Guid)) { processor.Unbox(h.MemberType); } else { processor.Cast(h.MemberType); } processor.SetMember(h); } processor.Return(); }
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 GenerateLoadSimpleValues(bool byIndex) { var name = byIndex ? "LoadSimpleValuesByIndex" : "LoadSimpleValuesByName"; var method = _result.DefineMethod(name, MethodAttr, null, new Type[] { objectType, iDataReaderType }); _result.DefineMethodOverride(method, byIndex ? handlerBaseLoadSimpleValuesByIndex : handlerBaseLoadSimpleValuesByName); var processor = new ILBuilder(method.GetILGenerator()); // User u = (User)o; processor.DeclareLocal(_model); processor.LoadArg(1).Cast(_model).SetLoc(0); // set values int n = 0; foreach (var f in _info.SimpleMembers) { processor.LoadLoc(0); if (f.Is.AllowNull) { processor.LoadArg(0); } processor.LoadArg(2); if (byIndex) { processor.LoadInt(n); } else { processor.LoadArg(2).LoadString(f.Name).CallVirtual(dataReaderGetOrdinal); } var mi1 = DataReaderEmitHelper.GetMethodInfo(f.MemberType); if (f.Is.AllowNull || mi1 == null) { processor.CallVirtual(dataReaderMethodInt); if (f.Is.AllowNull) { SetSecendArgForGetNullable(f, processor); processor.Call(handlerBaseTypeGetNullable); } // cast or unbox processor.CastOrUnbox(f.MemberType); } else { processor.CallVirtual(mi1); } processor.SetMember(f); n++; } processor.Return(); }
private void GenerateSetValuesDirect(ILBuilder processor, Func <MemberHandler, bool> cb1, Func <MemberHandler, bool> cb2) { // User u = (User)o; processor.DeclareLocal(_model); processor.LoadArg(2).Cast(_model).SetLoc(0); // set values int n = 0; foreach (var f in _info.Members) { if (!f.Is.DbGenerate && !f.Is.HasOne && !f.Is.HasMany && !f.Is.HasAndBelongsToMany) { if (!cb1(f)) { processor.LoadArg(1).LoadArg(0).LoadInt(n); if (cb2(f)) { processor.LoadInt(f.Is.Count ? 1 : 2) .Call(handlerBaseTypeNewSpKeyValueDirect); } else { processor.LoadLoc(0); processor.GetMember(f); if (f.Is.BelongsTo) { processor.CallVirtual(f.MemberType.GetMethod("get_ForeignKey")); } else if (f.Is.LazyLoad) { var it = f.MemberType.GetGenericArguments()[0]; processor.CallVirtual(f.MemberType.GetMethod("get_Value")); processor.Box(it); } else { processor.Box(f.MemberType); } processor.Call(handlerBaseTypeNewKeyValue); } processor.CallVirtual(keyOpValueListAdd); } n++; } } }
private void GenerateSetValuesForPartialUpdate(ILBuilder processor) { // User u = (User)o; processor.DeclareLocal(_model); processor.LoadArg(2).Cast(_model).SetLoc(0); // set values int n = 0; foreach (var f in _info.Members) { if (!f.Is.DbGenerate && !f.Is.HasOne && !f.Is.HasMany && !f.Is.HasAndBelongsToMany) { if (!f.Is.Key && (f.Is.UpdatedOn || f.Is.SavedOn || !f.Is.CreatedOn || f.Is.Count)) { if (f.Is.UpdatedOn || f.Is.SavedOn || f.Is.Count) { processor.LoadArg(1).LoadArg(0).LoadInt(n) .LoadInt(f.Is.Count ? 1 : 2) .Call(handlerBaseTypeNewSpKeyValueDirect).CallVirtual(keyOpValueListAdd); } else { processor.LoadArg(0).LoadArg(1).LoadLoc(0).LoadString(f.Name).LoadInt(n).LoadLoc(0); processor.GetMember(f); if (f.Is.BelongsTo) { processor.CallVirtual(f.MemberType.GetMethod("get_ForeignKey")); } else if (f.Is.LazyLoad) { var it = f.MemberType.GetGenericArguments()[0]; processor.CallVirtual(f.MemberType.GetMethod("get_Value")); processor.Box(it); } else { processor.Box(f.MemberType); } processor.Call(handlerBaseTypeAddKeyValue); } } n++; } } }
private static void GenerateSetValue(Type model, TypeBuilder builder, TinyMember info, Type memberType) { var method = builder.DefineMethod("SetValue", CtMethodAttr, null, new Type[] { objectType, objectType }); var processor = new ILBuilder(method.GetILGenerator()); processor.LoadArg(1).Cast(model).LoadArg(2).CastOrUnbox(memberType); processor.SetMember(info); processor.Return(); }
private static void GenerateSetValue(Type model, TypeBuilder builder, TinyMember info, Type memberType) { var method = builder.DefineMethod("SetValue", CtMethodAttr, null, new Type[]{objectType, objectType}); var processor = new ILBuilder(method.GetILGenerator()); processor.LoadArg(1).Cast(model).LoadArg(2).CastOrUnbox(memberType); processor.SetMember(info); processor.Return(); }
private void GenerateGetKeyValuesDirect() { var method = _result.DefineMethod("GetKeyValuesDirect", MethodAttr, null, new Type[] { dictionaryStringObjectType, objectType }); _result.DefineMethodOverride(method, handlerBaseGetKeyValuesDirect); var processor = new ILBuilder(method.GetILGenerator()); // User u = (User)o; processor.DeclareLocal(_model); processor.LoadArg(2).Cast(_model).SetLoc(0); // set values foreach (var f in _info.KeyMembers) { processor.LoadArg(1).LoadString(f.Name).LoadLoc(0); processor.GetMember(f); processor.Box(f.MemberType).CallVirtual(dictionaryStringObjectAdd); } processor.Return(); }
private void GenerateCtorInit(ILBuilder ctorBuilder) { var method = _result.DefineMethod("CtorInit", CtMethodAttr, null, dbObjectSmartUpdateArgs); _result.DefineMethodOverride(method, handlerBaseCtorInit); var processor = new ILBuilder(method.GetILGenerator()); foreach (var f in _info.Members) { if (!(f.Is.RelationField || f.Is.LazyLoad)) { continue; } if (f.MemberInfo.IsProperty) { var pi = (PropertyInfo)f.MemberInfo.GetMemberInfo(); var setter = pi.GetSetMethod(true); if (setter.IsPrivate) { GenerateNewMemberWithPrivateSetter(f, processor, ctorBuilder); } else { processor.LoadArg(1); GenerateNewMember(f, processor); processor.CallVirtual(setter); } } else { processor.LoadArg(1); GenerateNewMember(f, processor); processor.SetField((FieldInfo)f.MemberInfo.GetMemberInfo()); } } processor.Return(); }
private void GenerateConstructor() { _ctor = _result.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, new Type[] { }); var ctorBuilder = new ILBuilder(_ctor.GetILGenerator()); ctorBuilder.LoadArg(0); ctorBuilder.Call(objectCtor); ctorBuilder.DeclareLocal(typeof(Type)); ctorBuilder.LoadToken(_model); ctorBuilder.Call(getTypeFromHandle); ctorBuilder.SetLoc(0); GenerateCtorInit(ctorBuilder); ctorBuilder.Return(); }
private static void GenerateGetValue(Type model, TypeBuilder builder, TinyMember info, Type memberType) { var method = builder.DefineMethod("GetValue", CtMethodAttr, objectType, new Type[] { objectType }); var processor = new ILBuilder(method.GetILGenerator()); processor.DeclareLocal(objectType); processor.LoadArg(1).Cast(model); processor.GetMember(info); if (memberType.IsValueType) { processor.Box(memberType); } processor.SetLoc(0); processor.LoadLoc(0); processor.Return(); }
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 GenerateGetKeyValueDirect() { var method = _result.DefineMethod("GetKeyValueDirect", MethodAttr, objectType, new Type[] { objectType }); _result.DefineMethodOverride(method, handlerBaseGetKeyValueDirect); var processor = new ILBuilder(method.GetILGenerator()); if (_info.KeyMembers.Length == 1) { var h = _info.KeyMembers[0]; processor.LoadArg(1).Cast(_model); processor.GetMember(h); processor.Box(h.MemberType); } else { processor.LoadNull(); } processor.Return(); }
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(); }
private static void GenerateGetValue(Type model, TypeBuilder builder, TinyMember info, Type memberType) { var method = builder.DefineMethod("GetValue", CtMethodAttr, objectType, new Type[]{objectType}); var processor = new ILBuilder(method.GetILGenerator()); processor.DeclareLocal(objectType); processor.LoadArg(1).Cast(model); processor.GetMember(info); if (memberType.IsValueType) { processor.Box(memberType); } processor.SetLoc(0); processor.LoadLoc(0); processor.Return(); }