Example #1
0
        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);
        }
Example #2
0
        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);
        }
Example #3
0
        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);
            }
        }
Example #4
0
 private static IEnumerable <FieldBuilder> BuildFields(DynamicTypeDefinition definition, TypeBuilder typBuilder)
 {
     return(definition.Fields.Select(field => typBuilder.DefineField("_" + field.Name, field.Type,
                                                                     FieldAttributes.Private | FieldAttributes.InitOnly)));
 }
Example #5
0
        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);
            }
        }
Example #6
0
 private static IEnumerable<FieldBuilder> BuildFields(DynamicTypeDefinition definition, TypeBuilder typBuilder) {
     return definition.Fields.Select(field => typBuilder.DefineField("_" + field.Name, field.Type,
                                                                     FieldAttributes.Private | FieldAttributes.InitOnly));
 }
Example #7
0
 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;
 }
Example #8
0
 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;
 }