/// <summary> /// Creates a constructor for a generated class. The constructor will call Init on the Logic classes. /// </summary> /// <param name="fieldsToInit"></param> /// <param name="generatedTypeBuilder"></param> /// <param name="entityBase"></param> private void CreateConstructorLogic(IEnumerable<FieldBuilder> fieldsToInit, TypeBuilderHelper generatedTypeBuilder, Type entityBase) { //define public constructor var constructor = generatedTypeBuilder.DefinePublicConstructor().Emitter; //call base() constructor = constructor .ldarg_0 .call(entityBase.GetConstructor(new Type[] {})); //initialize all fields foreach (var fieldBuilder in fieldsToInit) { constructor .ldarg_0 .newobj(fieldBuilder.FieldType) .stfld(fieldBuilder) .ldarg_0 .ldfld(fieldBuilder) .ldarg_0 .callvirt(typeof (LogicBase<>).MakeGenericType(fieldBuilder.FieldType).GetMethod("set_CurrentInstance")); } //exit constructor constructor.ret(); }
private static ConstructorBuilderHelper BuildNestedTypeConstructor(TypeBuilderHelper nestedType) { Type[] parameters = { typeof(TypeAccessor), typeof(MemberInfo) }; ConstructorBuilderHelper ctorBuilder = nestedType.DefinePublicConstructor(parameters); ctorBuilder.Emitter .ldarg_0 .ldarg_1 .ldarg_2 .call (TypeHelper.GetConstructor(typeof(MemberAccessor), parameters)) .ret() ; return ctorBuilder; }