1: public Property(Attribute Attribute, TypeBuilder TypeBuilder, FieldBuilder ChangedField,ClassManager Manager)
2: {
3: Field = new Field(Attribute, TypeBuilder, FieldAttributes.Private);
4: if (Attribute.AttributeType == AttributeType.Map)
5: {
6: Attribute TempIDAttribute = new Attribute();
7: TempIDAttribute.AttributeType = Attribute.AttributeType;
8: Class TempClass = Manager[Attribute.Type];
9: foreach (Property TempProperty in TempClass.Properties)
10: {
11: if (TempProperty.Attribute.AttributeType == AttributeType.ID)
12: {
13: TempIDAttribute.Type = TempProperty.Attribute.Type;
14: }
15: }
16: TempIDAttribute.Name = Attribute.Name + "ID";
17: IDField = new Field(TempIDAttribute, TypeBuilder, FieldAttributes.Public);
18: }
19: MethodAttributes GetSetAttributes = MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig | MethodAttributes.Virtual;
20: MethodBuilder ValuePropertyGet = TypeBuilder.DefineMethod("get_" + Attribute.Name, GetSetAttributes, Attribute.Type, Type.EmptyTypes);
21: ILGenerator Generator = ValuePropertyGet.GetILGenerator();
22: if (Attribute.AttributeType == AttributeType.Map)
23: {
24: Label ExitIfStatement = Generator.DefineLabel();
25: Label ExitIf2Statement = Generator.DefineLabel();
26: Label ExitStatement = Generator.DefineLabel();
27: Generator.DeclareLocal(Field.FieldType);
28: Generator.DeclareLocal(typeof(bool));
29: Generator.Emit(OpCodes.Nop);
30: Generator.Emit(OpCodes.Ldarg_0);
31: Generator.Emit(OpCodes.Ldfld, Field.FieldBuilder);
32: Generator.Emit(OpCodes.Ldnull);
33: Generator.Emit(OpCodes.Ceq);
34: Generator.Emit(OpCodes.Ldc_I4_0);
35: Generator.Emit(OpCodes.Ceq);
36: Generator.Emit(OpCodes.Stloc_1);
37: Generator.Emit(OpCodes.Ldloc_1);
38: Generator.Emit(OpCodes.Brtrue_S, ExitIfStatement);
39: Generator.Emit(OpCodes.Nop);
40: Generator.Emit(OpCodes.Call, typeof(HaterAide.Factory).GetMethod("CreateSession"));
41: Generator.Emit(OpCodes.Ldarg_0);
42: Generator.Emit(OpCodes.Ldfld, IDField.FieldBuilder);
43: Generator.Emit(OpCodes.Box, IDField.FieldType);
44: Generator.Emit(OpCodes.Ldarg_0);
45: Generator.Emit(OpCodes.Ldflda, Field.FieldBuilder);
46: MethodInfo TempMethod = typeof(HaterAide.Session).GetMethod("Select");
47: TempMethod = TempMethod.MakeGenericMethod(new Type[] { Field.FieldType });
48: Generator.Emit(OpCodes.Callvirt, TempMethod);
49: Generator.Emit(OpCodes.Nop);
50: Generator.Emit(OpCodes.Nop);
51: Generator.MarkLabel(ExitIfStatement);
52: Generator.Emit(OpCodes.Ldarg_0);
53: Generator.Emit(OpCodes.Ldfld, Field.FieldBuilder);
54: Generator.Emit(OpCodes.Ldnull);
55: Generator.Emit(OpCodes.Ceq);
56: Generator.Emit(OpCodes.Ldc_I4_0);
57: Generator.Emit(OpCodes.Ceq);
58: Generator.Emit(OpCodes.Stloc_1);
59: Generator.Emit(OpCodes.Ldloc_1);
60: Generator.Emit(OpCodes.Brtrue_S, ExitIf2Statement);
61: Generator.Emit(OpCodes.Nop);
62: Generator.Emit(OpCodes.Ldarg_0);
63: Generator.Emit(OpCodes.Newobj, Field.FieldType.GetConstructor(new Type[0] { }));
64: Generator.Emit(OpCodes.Stfld, Field.FieldBuilder);
65: Generator.Emit(OpCodes.Nop);
66: Generator.MarkLabel(ExitIf2Statement);
67: Generator.Emit(OpCodes.Ldarg_0);
68: Generator.Emit(OpCodes.Ldfld, Field.FieldBuilder);
69: Generator.Emit(OpCodes.Stloc_0);
70: Generator.Emit(OpCodes.Br_S, ExitStatement);
71: Generator.MarkLabel(ExitStatement);
72: Generator.Emit(OpCodes.Ldloc_0);
73: Generator.Emit(OpCodes.Ret);
74: }
75: else
76: {
77: Generator.Emit(OpCodes.Ldarg_0);
78: Generator.Emit(OpCodes.Ldfld, Field.FieldBuilder);
79: Generator.Emit(OpCodes.Ret);
80: }
81:
82:
83: MethodBuilder ValuePropertySet = TypeBuilder.DefineMethod("set_" + Attribute.Name, GetSetAttributes, null, new Type[] { Attribute.Type });
84:
85: Generator = ValuePropertySet.GetILGenerator();
86:
87: Generator.Emit(OpCodes.Ldarg_0);
88: Generator.Emit(OpCodes.Ldarg_1);
89: Generator.Emit(OpCodes.Stfld, Field.FieldBuilder);
90: Generator.Emit(OpCodes.Ldarg_0);
91: Generator.Emit(OpCodes.Ldfld, ChangedField);
92: Generator.Emit(OpCodes.Ldstr, Attribute.Name);
93: Generator.Emit(OpCodes.Callvirt, typeof(List<string>).GetMethod("Add"));
94: Generator.Emit(OpCodes.Ret);
95:
96: _Attribute = Attribute;
97: }