annotate Source/TypeBuilder/Builders/AbstractTypeBuilderBase.cs @ 5:f7d63a092920

Исправлено условие Where в тех случаях, когда репозитарий не является генериком
author cin
date Tue, 10 Mar 2015 16:02:11 +0300
parents f990fcb411a9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1 using System;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2 using System.Collections;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3 using System.Collections.Generic;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4 using System.Diagnostics.CodeAnalysis;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5 using System.Reflection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6 using System.Reflection.Emit;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7 using System.Diagnostics;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9 using BLToolkit.Reflection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10 using BLToolkit.Reflection.Emit;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12 namespace BLToolkit.TypeBuilder.Builders
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14 public abstract class AbstractTypeBuilderBase : IAbstractTypeBuilder
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16 public virtual Type[] GetInterfaces()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21 private int _id;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22 public int ID
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24 get { return _id; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25 set { _id = value; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28 private object _targetElement;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29 public object TargetElement
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31 get { return _targetElement; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 set { _targetElement = value; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35 private BuildContext _context;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36 public BuildContext Context
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38 [DebuggerStepThrough] get { return _context; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39 [DebuggerStepThrough] set { _context = value; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 public virtual bool IsCompatible(BuildContext context, IAbstractTypeBuilder typeBuilder)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44 return true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47 protected bool IsRelative(IAbstractTypeBuilder typeBuilder)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49 if (typeBuilder == null) throw new ArgumentNullException("typeBuilder");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51 return GetType().IsInstanceOfType(typeBuilder) || typeBuilder.GetType().IsInstanceOfType(this);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54 public virtual bool IsApplied(BuildContext context, AbstractTypeBuilderList builders)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56 return false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59 public virtual int GetPriority(BuildContext context)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61 return TypeBuilderConsts.Priority.Normal;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64 public virtual void Build(BuildContext context)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66 if (context == null) throw new ArgumentNullException("context");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68 Context = context;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70 switch (context.Step)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72 case BuildStep.Begin: BeginMethodBuild(); return;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73 case BuildStep.End: EndMethodBuild(); return;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76 switch (context.BuildElement)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78 case BuildElement.Type:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79 switch (context.Step)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81 case BuildStep.Before: BeforeBuildType(); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82 case BuildStep.Build: BuildType(); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83 case BuildStep.After: AfterBuildType(); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84 case BuildStep.Catch: CatchBuildType(); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85 case BuildStep.Finally: FinallyBuildType(); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90 case BuildElement.AbstractGetter:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91 switch (context.Step)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93 case BuildStep.Before: BeforeBuildAbstractGetter(); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94 case BuildStep.Build: BuildAbstractGetter(); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95 case BuildStep.After: AfterBuildAbstractGetter(); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96 case BuildStep.Catch: CatchBuildAbstractGetter(); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97 case BuildStep.Finally: FinallyBuildAbstractGetter(); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102 case BuildElement.AbstractSetter:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103 switch (context.Step)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105 case BuildStep.Before: BeforeBuildAbstractSetter(); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106 case BuildStep.Build: BuildAbstractSetter(); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107 case BuildStep.After: AfterBuildAbstractSetter(); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108 case BuildStep.Catch: CatchBuildAbstractSetter(); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109 case BuildStep.Finally: FinallyBuildAbstractSetter(); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114 case BuildElement.AbstractMethod:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115 switch (context.Step)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117 case BuildStep.Before: BeforeBuildAbstractMethod(); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118 case BuildStep.Build: BuildAbstractMethod(); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119 case BuildStep.After: AfterBuildAbstractMethod(); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
120 case BuildStep.Catch: CatchBuildAbstractMethod(); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
121 case BuildStep.Finally: FinallyBuildAbstractMethod(); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
122 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
123
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
124 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
125
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
126 case BuildElement.VirtualGetter:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
127 switch (context.Step)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
128 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
129 case BuildStep.Before: BeforeBuildVirtualGetter(); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
130 case BuildStep.Build: BuildVirtualGetter(); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
131 case BuildStep.After: AfterBuildVirtualGetter(); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
132 case BuildStep.Catch: CatchBuildVirtualGetter(); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
133 case BuildStep.Finally: FinallyBuildVirtualGetter(); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
134 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
135
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
136 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
137
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
138 case BuildElement.VirtualSetter:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
139 switch (context.Step)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
140 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
141 case BuildStep.Before: BeforeBuildVirtualSetter(); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
142 case BuildStep.Build: BuildVirtualSetter(); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
143 case BuildStep.After: AfterBuildVirtualSetter(); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
144 case BuildStep.Catch: CatchBuildVirtualSetter(); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
145 case BuildStep.Finally: FinallyBuildVirtualSetter(); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
146 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
147
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
148 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
149
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
150 case BuildElement.VirtualMethod:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
151 switch (context.Step)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
152 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
153 case BuildStep.Before: BeforeBuildVirtualMethod(); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
154 case BuildStep.Build: BuildVirtualMethod(); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
155 case BuildStep.After: AfterBuildVirtualMethod(); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
156 case BuildStep.Catch: CatchBuildVirtualMethod(); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
157 case BuildStep.Finally: FinallyBuildVirtualMethod(); break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
158 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
159
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
160 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
161
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
162 case BuildElement.InterfaceMethod:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
163 BuildInterfaceMethod();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
164 break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
165 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
166 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
167
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
168 protected virtual void BeforeBuildType () {}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
169 protected virtual void BuildType () {}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
170 protected virtual void AfterBuildType () {}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
171 protected virtual void CatchBuildType () {}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
172 protected virtual void FinallyBuildType () {}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
173
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
174 protected virtual void BeforeBuildAbstractGetter() {}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
175 protected virtual void BuildAbstractGetter() {}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
176 protected virtual void AfterBuildAbstractGetter() {}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
177 protected virtual void CatchBuildAbstractGetter() {}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
178 protected virtual void FinallyBuildAbstractGetter() {}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
179
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
180 protected virtual void BeforeBuildAbstractSetter() {}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
181 protected virtual void BuildAbstractSetter() {}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
182 protected virtual void AfterBuildAbstractSetter() {}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
183 protected virtual void CatchBuildAbstractSetter() {}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
184 protected virtual void FinallyBuildAbstractSetter() {}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
185
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
186 protected virtual void BeforeBuildAbstractMethod() {}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
187 protected virtual void BuildAbstractMethod() {}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
188 protected virtual void AfterBuildAbstractMethod() {}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
189 protected virtual void CatchBuildAbstractMethod() {}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
190 protected virtual void FinallyBuildAbstractMethod() {}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
191
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
192 protected virtual void BeforeBuildVirtualGetter () {}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
193 protected virtual void BuildVirtualGetter () {}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
194 protected virtual void AfterBuildVirtualGetter () {}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
195 protected virtual void CatchBuildVirtualGetter () {}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
196 protected virtual void FinallyBuildVirtualGetter () {}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
197
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
198 protected virtual void BeforeBuildVirtualSetter () {}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
199 protected virtual void BuildVirtualSetter () {}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
200 protected virtual void AfterBuildVirtualSetter () {}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
201 protected virtual void CatchBuildVirtualSetter () {}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
202 protected virtual void FinallyBuildVirtualSetter () {}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
203
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
204 protected virtual void BeforeBuildVirtualMethod () {}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
205 protected virtual void BuildVirtualMethod () {}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
206 protected virtual void AfterBuildVirtualMethod () {}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
207 protected virtual void CatchBuildVirtualMethod () {}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
208 protected virtual void FinallyBuildVirtualMethod () {}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
209
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
210 protected virtual void BuildInterfaceMethod () {}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
211
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
212 protected virtual void BeginMethodBuild () {}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
213 protected virtual void EndMethodBuild () {}
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
214
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
215 #region Helpers
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
216
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
217 [SuppressMessage("Microsoft.Design", "CA1011:ConsiderPassingBaseTypesAsParameters")]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
218 protected bool CallLazyInstanceInsurer(FieldBuilder field)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
219 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
220 if (field == null) throw new ArgumentNullException("field");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
221
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
222 MethodBuilderHelper ensurer = Context.GetFieldInstanceEnsurer(field.Name);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
223
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
224 if (ensurer != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
225 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
226 Context.MethodBuilder.Emitter
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
227 .ldarg_0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
228 .call (ensurer);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
229 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
230
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
231 return ensurer != null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
232 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
233
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
234 [SuppressMessage("Microsoft.Performance", "CA1818:DoNotConcatenateStringsInsideLoops")]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
235 protected virtual string GetFieldName(PropertyInfo propertyInfo)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
236 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
237 string name = propertyInfo.Name;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
238
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
239 if (char.IsUpper(name[0]) && name.Length > 1 && char.IsLower(name[1]))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
240 name = char.ToLower(name[0]) + name.Substring(1, name.Length - 1);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
241
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
242 name = "_" + name;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
243
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
244 foreach (ParameterInfo p in propertyInfo.GetIndexParameters())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
245 name += "." + p.ParameterType.FullName;//.Replace(".", "_").Replace("+", "_");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
246
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
247 return name;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
248 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
249
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
250 protected string GetFieldName()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
251 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
252 return GetFieldName(Context.CurrentProperty);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
253 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
254
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
255 protected FieldBuilder GetPropertyInfoField(PropertyInfo property)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
256 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
257 string fieldName = GetFieldName(property) + "_$propertyInfo";
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
258 FieldBuilder field = Context.GetField(fieldName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
259
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
260 if (field == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
261 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
262 field = Context.CreatePrivateStaticField(fieldName, typeof(PropertyInfo));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
263
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
264 EmitHelper emit = Context.TypeBuilder.TypeInitializer.Emitter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
265
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
266 ParameterInfo[] index = property.GetIndexParameters();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
267
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
268 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
269 .LoadType (Context.Type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
270 .ldstr (property.Name)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
271 .LoadType (property.PropertyType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
272 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
273
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
274 if (index.Length == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
275 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
276 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
277 .ldsfld (typeof(Type).GetField("EmptyTypes"))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
278 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
279 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
280 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
281 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
282 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
283 .ldc_i4 (index.Length)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
284 .newarr (typeof(Type))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
285 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
286
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
287 for (int i = 0; i < index.Length; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
288 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
289 .dup
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
290 .ldc_i4 (i)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
291 .LoadType (index[i].ParameterType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
292 .stelem_ref
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
293 .end()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
294 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
295 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
296
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
297 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
298 .call (typeof(TypeHelper).GetMethod("GetPropertyInfo"))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
299 .stsfld (field)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
300 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
301 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
302
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
303 return field;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
304 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
305
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
306 protected FieldBuilder GetPropertyInfoField()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
307 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
308 return GetPropertyInfoField(Context.CurrentProperty);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
309 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
310
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
311 protected FieldBuilder GetParameterField()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
312 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
313 string fieldName = GetFieldName() + "_$parameters";
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
314 FieldBuilder field = Context.GetField(fieldName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
315
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
316 if (field == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
317 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
318 field = Context.CreatePrivateStaticField(fieldName, typeof(object[]));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
319
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
320 FieldBuilder piField = GetPropertyInfoField();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
321 EmitHelper emit = Context.TypeBuilder.TypeInitializer.Emitter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
322
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
323 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
324 .ldsfld (piField)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
325 .call (typeof(TypeHelper).GetMethod("GetPropertyParameters"))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
326 .stsfld (field)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
327 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
328 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
329
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
330 return field;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
331 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
332
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
333 protected FieldBuilder GetTypeAccessorField()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
334 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
335 string fieldName = "_" + GetObjectType().FullName + "_$typeAccessor";
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
336 FieldBuilder field = Context.GetField(fieldName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
337
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
338 if (field == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
339 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
340 field = Context.CreatePrivateStaticField(fieldName, typeof(TypeAccessor));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
341
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
342 EmitHelper emit = Context.TypeBuilder.TypeInitializer.Emitter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
343
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
344 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
345 .LoadType (GetObjectType())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
346 .call (typeof(TypeAccessor), "GetAccessor", typeof(Type))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
347 .stsfld (field)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
348 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
349 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
350
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
351 return field;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
352 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
353
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
354 protected FieldBuilder GetArrayInitializer(Type arrayType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
355 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
356 string fieldName = "_array_of_$_" + arrayType.FullName;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
357 FieldBuilder field = Context.GetField(fieldName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
358
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
359 if (field == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
360 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
361 field = Context.CreatePrivateStaticField(fieldName, arrayType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
362
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
363 EmitHelper emit = Context.TypeBuilder.TypeInitializer.Emitter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
364
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
365 int rank = arrayType.GetArrayRank();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
366
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
367 if (rank > 1)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
368 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
369 Type[] parameters = new Type[rank];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
370
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
371 for (int i = 0; i < parameters.Length; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
372 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
373 parameters[i] = typeof(int);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
374 emit.ldc_i4_0.end();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
375 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
376
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
377 ConstructorInfo ci = TypeHelper.GetConstructor(arrayType, parameters);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
378
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
379 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
380 .newobj (ci)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
381 .stsfld (field)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
382 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
383 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
384 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
385 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
386 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
387 .ldc_i4_0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
388 .newarr (arrayType.GetElementType())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
389 .stsfld (field)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
390 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
391 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
392 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
393
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
394 return field;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
395 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
396
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
397 protected FieldBuilder GetArrayInitializer()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
398 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
399 return GetArrayInitializer(Context.CurrentProperty.PropertyType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
400 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
401
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
402 protected virtual Type GetFieldType()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
403 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
404 var pi = Context.CurrentProperty;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
405 var index = pi.GetIndexParameters();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
406
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
407 switch (index.Length)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
408 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
409 case 0: return pi.PropertyType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
410 case 1: return typeof(Dictionary<object,object>);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
411 default:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
412 throw new InvalidOperationException();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
413 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
414 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
415
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
416 protected virtual Type GetObjectType()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
417 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
418 return GetFieldType();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
419 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
420
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
421 protected virtual bool IsObjectHolder
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
422 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
423 get { return false; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
424 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
425
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
426 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
427 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
428 }