annotate Source/TypeBuilder/Builders/InstanceTypeBuilder.cs @ 9:1e85f66cf767 default tip

update bltoolkit
author nickolay
date Thu, 05 Apr 2018 20:53:26 +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.Reflection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3 using System.Reflection.Emit;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5 using BLToolkit.Properties;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6 using BLToolkit.Reflection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7 using BLToolkit.Reflection.Emit;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9 namespace BLToolkit.TypeBuilder.Builders
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11 class InstanceTypeBuilder : DefaultTypeBuilder
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13 public InstanceTypeBuilder(Type instanceType, bool isObjectHolder)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15 _instanceType = instanceType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16 _isObjectHolder = isObjectHolder;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 public InstanceTypeBuilder(Type propertyType, Type instanceType, bool isObjectHolder)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21 _propertyType = propertyType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22 _instanceType = instanceType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23 _isObjectHolder = isObjectHolder;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26 private readonly bool _isObjectHolder;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28 private readonly Type _propertyType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29 public Type PropertyType
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31 get { return _propertyType; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34 private readonly Type _instanceType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35 public Type InstanceType
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37 get { return _instanceType; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40 public override bool IsApplied(BuildContext context, AbstractTypeBuilderList builders)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 if (context == null) throw new ArgumentNullException("context");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44 return
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45 base.IsApplied(context, builders) &&
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46 context.CurrentProperty != null &&
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47 context.CurrentProperty.GetIndexParameters().Length == 0 &&
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48 (PropertyType == null ||
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49 TypeHelper.IsSameOrParent(PropertyType, context.CurrentProperty.PropertyType));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52 protected override Type GetFieldType()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54 return InstanceType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57 protected override Type GetObjectType()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59 return IsObjectHolder? Context.CurrentProperty.PropertyType: base.GetObjectType();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62 protected override bool IsObjectHolder
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64 get { return _isObjectHolder && Context.CurrentProperty.PropertyType.IsClass; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67 protected override void BuildAbstractGetter()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69 var field = GetField();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70 var emit = Context.MethodBuilder.Emitter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71 var propertyType = Context.CurrentProperty.PropertyType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72 var getter = GetGetter();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74 if (InstanceType.IsValueType) emit.ldarg_0.ldflda(field);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75 else emit.ldarg_0.ldfld (field);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77 Type memberType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79 if (getter is PropertyInfo)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81 var pi = ((PropertyInfo)getter);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83 if (InstanceType.IsValueType) emit.call (pi.GetGetMethod());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84 else emit.callvirt(pi.GetGetMethod());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86 memberType = pi.PropertyType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88 else if (getter is FieldInfo)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90 var fi = (FieldInfo)getter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92 emit.ldfld(fi);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94 memberType = fi.FieldType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98 var mi = (MethodInfo)getter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99 var pi = mi.GetParameters();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101 for (var k = 0; k < pi.Length; k++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103 var p = pi[k];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105 if (p.IsDefined(typeof(ParentAttribute), true))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107 // Parent - set this.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109 emit.ldarg_0.end();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111 if (!TypeHelper.IsSameOrParent(p.ParameterType, Context.Type))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112 emit.castclass(p.ParameterType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114 else if (p.IsDefined(typeof (PropertyInfoAttribute), true))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116 // PropertyInfo.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118 emit.ldsfld(GetPropertyInfoField()).end();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
120 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
121 throw new TypeBuilderException(string.Format(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
122 Resources.TypeBuilder_UnknownParameterType,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
123 mi.Name, mi.DeclaringType.FullName, p.Name));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
124
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
125 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
126
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
127 if (InstanceType.IsValueType) emit.call (mi);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
128 else emit.callvirt(mi);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
129
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
130 memberType = mi.ReturnType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
131 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
132
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
133 if (propertyType.IsValueType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
134 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
135 if (memberType.IsValueType == false)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
136 emit.CastFromObject(propertyType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
137 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
138 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
139 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
140 if (memberType != propertyType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
141 emit.castclass(propertyType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
142 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
143
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
144 emit.stloc(Context.ReturnValue);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
145 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
146
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
147 protected override void BuildAbstractSetter()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
148 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
149 var field = GetField();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
150 var emit = Context.MethodBuilder.Emitter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
151 var propertyType = Context.CurrentProperty.PropertyType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
152 var setter = GetSetter();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
153
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
154 if (InstanceType.IsValueType) emit.ldarg_0.ldflda(field);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
155 else emit.ldarg_0.ldfld (field);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
156
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
157 if (setter is PropertyInfo)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
158 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
159 var pi = ((PropertyInfo)setter);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
160
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
161 emit.ldarg_1.end();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
162
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
163 if (propertyType.IsValueType && !pi.PropertyType.IsValueType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
164 emit.box(propertyType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
165
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
166 if (InstanceType.IsValueType) emit.call (pi.GetSetMethod());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
167 else emit.callvirt(pi.GetSetMethod());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
168 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
169 else if (setter is FieldInfo)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
170 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
171 var fi = (FieldInfo)setter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
172
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
173 emit.ldarg_1.end();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
174
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
175 if (propertyType.IsValueType && !fi.FieldType.IsValueType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
176 emit.box(propertyType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
177
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
178 emit.stfld(fi);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
179 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
180 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
181 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
182 var mi = (MethodInfo)setter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
183 var pi = mi.GetParameters();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
184 var gotValueParam = false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
185
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
186 for (var k = 0; k < pi.Length; k++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
187 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
188 var p = pi[k];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
189
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
190 if (p.IsDefined(typeof (ParentAttribute), true))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
191 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
192 // Parent - set this.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
193 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
194 emit.ldarg_0.end();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
195
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
196 if (!TypeHelper.IsSameOrParent(p.ParameterType, Context.Type))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
197 emit.castclass(p.ParameterType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
198 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
199 else if (p.IsDefined(typeof (PropertyInfoAttribute), true))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
200 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
201 // PropertyInfo.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
202 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
203 emit.ldsfld(GetPropertyInfoField()).end();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
204 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
205 else if (!gotValueParam)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
206 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
207 // This must be a value.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
208 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
209 emit.ldarg_1.end();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
210
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
211 if (propertyType.IsValueType && !p.ParameterType.IsValueType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
212 emit.box(propertyType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
213
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
214 gotValueParam = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
215 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
216 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
217 throw new TypeBuilderException(string.Format(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
218 Resources.TypeBuilder_UnknownParameterType,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
219 mi.Name, mi.DeclaringType.FullName, p.Name));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
220 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
221
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
222 if (InstanceType.IsValueType) emit.call(mi);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
223 else emit.callvirt(mi);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
224 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
225 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
226
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
227 private MemberInfo GetGetter()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
228 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
229 const BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.Instance;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
230
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
231 var propertyType = Context.CurrentProperty.PropertyType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
232 var fields = InstanceType.GetFields(bindingFlags);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
233
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
234 foreach (var field in fields)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
235 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
236 var attrs = field.GetCustomAttributes(typeof(GetValueAttribute), true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
237
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
238 if (attrs.Length > 0 && TypeHelper.IsSameOrParent(field.FieldType, propertyType))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
239 return field;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
240 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
241
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
242 var props = InstanceType.GetProperties(bindingFlags);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
243
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
244 foreach (var prop in props)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
245 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
246 var attrs = prop.GetCustomAttributes(typeof(GetValueAttribute), true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
247
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
248 if (attrs.Length > 0 && TypeHelper.IsSameOrParent(prop.PropertyType, propertyType))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
249 return prop;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
250 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
251
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
252 foreach (var field in fields)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
253 if (field.Name == "Value" && TypeHelper.IsSameOrParent(field.FieldType, propertyType))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
254 return field;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
255
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
256 foreach (var prop in props)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
257 if (prop.Name == "Value" && TypeHelper.IsSameOrParent(prop.PropertyType, propertyType))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
258 return prop;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
259
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
260 var method = TypeHelper.GetMethod(InstanceType, false, "GetValue", bindingFlags);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
261
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
262 if (method != null && TypeHelper.IsSameOrParent(propertyType, method.ReturnType))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
263 return method;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
264
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
265 throw new TypeBuilderException(string.Format(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
266 Resources.TypeBuilder_CannotGetGetter, InstanceType.FullName,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
267 propertyType.FullName, Context.CurrentProperty.Name, Context.Type.FullName));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
268 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
269
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
270 private MemberInfo GetSetter()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
271 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
272 const BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.Instance;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
273
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
274 var propertyType = Context.CurrentProperty.PropertyType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
275 var fields = InstanceType.GetFields(bindingFlags);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
276
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
277 foreach (var field in fields)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
278 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
279 var attrs = field.GetCustomAttributes(typeof(SetValueAttribute), true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
280
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
281 if (attrs.Length > 0 && TypeHelper.IsSameOrParent(field.FieldType, propertyType))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
282 return field;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
283 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
284
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
285 var props = InstanceType.GetProperties(bindingFlags);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
286
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
287 foreach (var prop in props)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
288 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
289 var attrs = prop.GetCustomAttributes(typeof(SetValueAttribute), true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
290
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
291 if (attrs.Length > 0 && TypeHelper.IsSameOrParent(prop.PropertyType, propertyType))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
292 return prop;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
293 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
294
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
295 foreach (var field in fields)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
296 if (field.Name == "Value" && TypeHelper.IsSameOrParent(field.FieldType, propertyType))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
297 return field;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
298
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
299 foreach (var prop in props)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
300 if (prop.Name == "Value" && TypeHelper.IsSameOrParent(prop.PropertyType, propertyType))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
301 return prop;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
302
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
303 var method = TypeHelper.GetMethod(InstanceType, false, "SetValue", bindingFlags);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
304
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
305 if (method != null && method.ReturnType == typeof(void))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
306 return method;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
307
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
308 throw new TypeBuilderException(string.Format(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
309 Resources.TypeBuilder_CannotGetSetter, InstanceType.FullName,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
310 propertyType.FullName, Context.CurrentProperty.Name, Context.Type.FullName));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
311 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
312 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
313 }