private static TypeBuilder BuildType(DynamicTypeDefinition definition, ModuleBuilder modBuilder) { // Build the type var typeName = string.Format("{0}.{1}.{2}PartRecord", AssemblyName, "Records", definition.Name); var typBuilder = modBuilder.DefineType(typeName, TypeAttributes.Public | TypeAttributes.Class | TypeAttributes.AutoClass | TypeAttributes.AnsiClass | TypeAttributes.BeforeFieldInit | TypeAttributes.AutoLayout, typeof(ContentPartVersionRecord)); return(typBuilder); }
private static TypeBuilder BuildHandlerType(DynamicTypeDefinition definition, ModuleBuilder modBuilder, Type type) { // Build the type var typeName = string.Format("{0}.{1}.{2}PartHandler", AssemblyName, "Records", definition.Name); Type contentType = typeof(DynamicContentsHandler <>); var genericContentType = contentType.MakeGenericType(type); var typBuilder = modBuilder.DefineType(typeName, TypeAttributes.Public | TypeAttributes.Class | TypeAttributes.AutoClass | TypeAttributes.AnsiClass | TypeAttributes.BeforeFieldInit | TypeAttributes.AutoLayout, genericContentType); return(typBuilder); }
private static void BuildProperties(DynamicTypeDefinition definition, TypeBuilder typBuilder, List <FieldBuilder> fieldBuilders, bool userParanet) { var fields = definition.Fields.ToList(); for (int i = 0; i < fields.Count; i++) { var propBuilder = typBuilder.DefineProperty( fields[i].Name, PropertyAttributes.HasDefault, fields[i].Type, Type.EmptyTypes); // Build Get prop var getMethBuilder = typBuilder.DefineMethod( "get_" + fields[i].Name, MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.SpecialName | MethodAttributes.HideBySig, fields[i].Type, Type.EmptyTypes); var generator = getMethBuilder.GetILGenerator(); if (userParanet) { MethodInfo getRecord = typBuilder.BaseType.GetProperty("Record").GetGetMethod(); MethodInfo mi = typBuilder.BaseType.GetProperty("Record").PropertyType.GetProperty(fields[i].Name).GetGetMethod(); generator.DeclareLocal(fields[i].Type); generator.Emit(OpCodes.Ldarg_0); generator.Emit(OpCodes.Call, getRecord); generator.Emit(OpCodes.Callvirt, mi); generator.Emit(OpCodes.Stloc_0); Label targetInstruction = generator.DefineLabel(); generator.Emit(OpCodes.Br_S, targetInstruction); generator.MarkLabel(targetInstruction); generator.Emit(OpCodes.Ldloc_0); generator.Emit(OpCodes.Ret); } else { generator.Emit(OpCodes.Ldarg_0); // load 'this' generator.Emit(OpCodes.Ldfld, fieldBuilders[i]); // load the field generator.Emit(OpCodes.Ret); } propBuilder.SetGetMethod(getMethBuilder); // Build Set prop var setMethBuilder = typBuilder.DefineMethod( "set_" + fields[i].Name, MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.SpecialName | MethodAttributes.HideBySig, typeof(void), new[] { fieldBuilders[i].FieldType }); generator = setMethBuilder.GetILGenerator(); if (userParanet) { MethodInfo rmi = typBuilder.BaseType.GetProperty("Record").GetGetMethod(); MethodInfo mi = typBuilder.BaseType.GetProperty("Record").PropertyType.GetProperty(fields[i].Name).GetSetMethod(); generator.Emit(OpCodes.Ldarg_0); generator.Emit(OpCodes.Call, rmi); generator.Emit(OpCodes.Ldarg_1); generator.Emit(OpCodes.Call, mi); generator.Emit(OpCodes.Ret); } else { generator.Emit(OpCodes.Ldarg_0); // load 'this' generator.Emit(OpCodes.Ldarg_1); // load value generator.Emit(OpCodes.Stfld, fieldBuilders[i]); generator.Emit(OpCodes.Ret); } propBuilder.SetSetMethod(setMethBuilder); } }
private static IEnumerable <FieldBuilder> BuildFields(DynamicTypeDefinition definition, TypeBuilder typBuilder) { return(definition.Fields.Select(field => typBuilder.DefineField("_" + field.Name, field.Type, FieldAttributes.Private | FieldAttributes.InitOnly))); }
private static void BuildProperties(DynamicTypeDefinition definition, TypeBuilder typBuilder, List<FieldBuilder> fieldBuilders, bool userParanet) { var fields = definition.Fields.ToList(); for (int i = 0; i < fields.Count; i++) { var propBuilder = typBuilder.DefineProperty( fields[i].Name, PropertyAttributes.HasDefault, fields[i].Type, Type.EmptyTypes); // Build Get prop var getMethBuilder = typBuilder.DefineMethod( "get_" + fields[i].Name, MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.SpecialName | MethodAttributes.HideBySig, fields[i].Type, Type.EmptyTypes); var generator = getMethBuilder.GetILGenerator(); if (userParanet) { MethodInfo getRecord = typBuilder.BaseType.GetProperty("Record").GetGetMethod(); MethodInfo mi = typBuilder.BaseType.GetProperty("Record").PropertyType.GetProperty(fields[i].Name).GetGetMethod(); generator.DeclareLocal(fields[i].Type); generator.Emit(OpCodes.Ldarg_0); generator.Emit(OpCodes.Call, getRecord); generator.Emit(OpCodes.Callvirt, mi); generator.Emit(OpCodes.Stloc_0); Label targetInstruction = generator.DefineLabel(); generator.Emit(OpCodes.Br_S, targetInstruction); generator.MarkLabel(targetInstruction); generator.Emit(OpCodes.Ldloc_0); generator.Emit(OpCodes.Ret); } else { generator.Emit(OpCodes.Ldarg_0); // load 'this' generator.Emit(OpCodes.Ldfld, fieldBuilders[i]); // load the field generator.Emit(OpCodes.Ret); } propBuilder.SetGetMethod(getMethBuilder); // Build Set prop var setMethBuilder = typBuilder.DefineMethod( "set_" + fields[i].Name, MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.SpecialName | MethodAttributes.HideBySig, typeof(void), new[] { fieldBuilders[i].FieldType }); generator = setMethBuilder.GetILGenerator(); if (userParanet) { MethodInfo rmi = typBuilder.BaseType.GetProperty("Record").GetGetMethod(); MethodInfo mi = typBuilder.BaseType.GetProperty("Record").PropertyType.GetProperty(fields[i].Name).GetSetMethod(); generator.Emit(OpCodes.Ldarg_0); generator.Emit(OpCodes.Call, rmi); generator.Emit(OpCodes.Ldarg_1); generator.Emit(OpCodes.Call, mi); generator.Emit(OpCodes.Ret); } else { generator.Emit(OpCodes.Ldarg_0); // load 'this' generator.Emit(OpCodes.Ldarg_1); // load value generator.Emit(OpCodes.Stfld, fieldBuilders[i]); generator.Emit(OpCodes.Ret); } propBuilder.SetSetMethod(setMethBuilder); } }
private static IEnumerable<FieldBuilder> BuildFields(DynamicTypeDefinition definition, TypeBuilder typBuilder) { return definition.Fields.Select(field => typBuilder.DefineField("_" + field.Name, field.Type, FieldAttributes.Private | FieldAttributes.InitOnly)); }
private static TypeBuilder BuildHandlerType(DynamicTypeDefinition definition, ModuleBuilder modBuilder, Type type) { // Build the type var typeName = string.Format("{0}.{1}.{2}PartHandler", AssemblyName, "Records", definition.Name); Type contentType = typeof(DynamicContentsHandler<>); var genericContentType = contentType.MakeGenericType(type); var typBuilder = modBuilder.DefineType(typeName, TypeAttributes.Public | TypeAttributes.Class | TypeAttributes.AutoClass | TypeAttributes.AnsiClass | TypeAttributes.BeforeFieldInit | TypeAttributes.AutoLayout, genericContentType); return typBuilder; }
private static TypeBuilder BuildType(DynamicTypeDefinition definition, ModuleBuilder modBuilder) { // Build the type var typeName = string.Format("{0}.{1}.{2}PartRecord", AssemblyName, "Records", definition.Name); var typBuilder = modBuilder.DefineType(typeName, TypeAttributes.Public | TypeAttributes.Class | TypeAttributes.AutoClass | TypeAttributes.AnsiClass | TypeAttributes.BeforeFieldInit | TypeAttributes.AutoLayout, typeof(ContentPartVersionRecord)); return typBuilder; }