1: public class DynamicType
2: { 3:
4: public static AssemblyBuilder asmBuilder = null;
5: public static ModuleBuilder modBuilder = null;
6: public static void GenerateAssemblyAndModule()
7: { 8: if (asmBuilder == null)
9: { 10: AssemblyName assemblyName = new AssemblyName();
11: assemblyName.Name = "DWBeacons";
12: AppDomain thisDomain = Thread.GetDomain();
13: asmBuilder = thisDomain.DefineDynamicAssembly(
14: assemblyName, AssemblyBuilderAccess.Run);
15: modBuilder = asmBuilder.DefineDynamicModule(
16: asmBuilder.GetName().Name, false);
17: }
18: }
19:
20: public static TypeBuilder CreateType(ModuleBuilder modBuilder, string typeName)
21: { 22: TypeBuilder typeBuilder = modBuilder.DefineType(typeName,
23: TypeAttributes.Public |
24: TypeAttributes.Class |
25: TypeAttributes.AutoClass |
26: TypeAttributes.AnsiClass |
27: TypeAttributes.BeforeFieldInit |
28: TypeAttributes.AutoLayout,
29: typeof(object));
30: return typeBuilder;
31: }
32:
33:
34: public static void CreateProperty(TypeBuilder t, string name, Type typ)
35: { 36: string field = "_" + name.ToLower();
37: FieldBuilder fieldBldr = t.DefineField(field, typ, FieldAttributes.Private);
38: PropertyBuilder propBldr = t.DefineProperty(name, PropertyAttributes.HasDefault, typ, null);
39: MethodAttributes getSetAttr = MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig;
40:
41: MethodBuilder getPropBldr = t.DefineMethod("get_" + name, getSetAttr, typ, Type.EmptyTypes); 42:
43: ILGenerator getIL = getPropBldr.GetILGenerator();
44: getIL.Emit(OpCodes.Ldarg_0);
45: getIL.Emit(OpCodes.Ldfld, fieldBldr);
46: getIL.Emit(OpCodes.Ret);
47:
48: MethodBuilder setPropBldr = t.DefineMethod("set_" + name, getSetAttr, null, new Type[] { typ }); 49:
50: ILGenerator setIL = setPropBldr.GetILGenerator();
51:
52: setIL.Emit(OpCodes.Ldarg_0);
53: setIL.Emit(OpCodes.Ldarg_1);
54: setIL.Emit(OpCodes.Stfld, fieldBldr);
55: setIL.Emit(OpCodes.Ret);
56:
57: propBldr.SetGetMethod(getPropBldr);
58: propBldr.SetSetMethod(setPropBldr);
59:
60: }
61:
62: }