annotate Source/Reflection/Emit/TypeBuilderHelper.cs @ 6:11b6da379593

Исправлена странная ошибка при использовании OfType<...>().Where(...)
author cin
date Mon, 05 Dec 2016 05:50:52 +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.Generic;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3 using System.Reflection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4 using System.Reflection.Emit;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6 namespace BLToolkit.Reflection.Emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8 using TypeBuilder.Builders;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11 /// A wrapper around the <see cref="TypeBuilder"/> class.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13 /// <include file="Examples.CS.xml" path='examples/emit[@name="Emit"]/*' />
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14 /// <include file="Examples.VB.xml" path='examples/emit[@name="Emit"]/*' />
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15 /// <seealso cref="System.Reflection.Emit.TypeBuilder">TypeBuilder Class</seealso>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16 public class TypeBuilderHelper
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 /// Initializes a new instance of the <see cref="TypeBuilderHelper"/> class
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20 /// with the specified parameters.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22 /// <param name="assemblyBuilder">Associated <see cref="AssemblyBuilderHelper"/>.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23 /// <param name="typeBuilder">A <see cref="TypeBuilder"/></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24 public TypeBuilderHelper(AssemblyBuilderHelper assemblyBuilder, System.Reflection.Emit.TypeBuilder typeBuilder)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26 if (assemblyBuilder == null) throw new ArgumentNullException("assemblyBuilder");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27 if (typeBuilder == null) throw new ArgumentNullException("typeBuilder");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29 _assembly = assemblyBuilder;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30 _typeBuilder = typeBuilder;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 _typeBuilder.SetCustomAttribute(_assembly.BLToolkitAttribute);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35 private readonly AssemblyBuilderHelper _assembly;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37 /// Gets associated <see cref="AssemblyBuilderHelper"/>.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39 public AssemblyBuilderHelper Assembly
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41 get { return _assembly; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44 private readonly System.Reflection.Emit.TypeBuilder _typeBuilder;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46 /// Gets <see cref="System.Reflection.Emit.TypeBuilder"/>.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48 public System.Reflection.Emit.TypeBuilder TypeBuilder
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50 get { return _typeBuilder; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54 /// Converts the supplied <see cref="TypeBuilderHelper"/> to a <see cref="TypeBuilder"/>.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56 /// <param name="typeBuilder">The <see cref="TypeBuilderHelper"/>.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57 /// <returns>A <see cref="TypeBuilder"/>.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58 public static implicit operator System.Reflection.Emit.TypeBuilder(TypeBuilderHelper typeBuilder)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60 if (typeBuilder == null) throw new ArgumentNullException("typeBuilder");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62 return typeBuilder.TypeBuilder;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65 #region DefineMethod Overrides
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68 /// Adds a new method to the class, with the given name and method signature.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70 /// <param name="name">The name of the method. name cannot contain embedded nulls. </param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71 /// <param name="attributes">The attributes of the method. </param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72 /// <param name="returnType">The return type of the method.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73 /// <param name="parameterTypes">The types of the parameters of the method.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74 /// <returns>The defined method.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75 public MethodBuilderHelper DefineMethod(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76 string name, MethodAttributes attributes, Type returnType, params Type[] parameterTypes)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78 return new MethodBuilderHelper(this, _typeBuilder.DefineMethod(name, attributes, returnType, parameterTypes));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82 /// Adds a new method to the class, with the given name and method signature.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84 /// <param name="name">The name of the method. name cannot contain embedded nulls. </param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85 /// <param name="attributes">The attributes of the method. </param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86 /// <param name="callingConvention">The <see cref="CallingConventions">calling convention</see> of the method.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87 /// <param name="returnType">The return type of the method.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88 /// <param name="parameterTypes">The types of the parameters of the method.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89 /// <returns>The defined method.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90 public MethodBuilderHelper DefineMethod(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91 string name,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92 MethodAttributes attributes,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93 CallingConventions callingConvention,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94 Type returnType,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95 Type[] parameterTypes)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97 return new MethodBuilderHelper(this, _typeBuilder.DefineMethod(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98 name, attributes, callingConvention, returnType, parameterTypes));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102 /// Adds a new method to the class, with the given name and method signature.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104 /// <param name="name">The name of the method. name cannot contain embedded nulls. </param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105 /// <param name="attributes">The attributes of the method. </param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106 /// <param name="returnType">The return type of the method.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107 /// <returns>The defined method.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108 public MethodBuilderHelper DefineMethod(string name, MethodAttributes attributes, Type returnType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110 return new MethodBuilderHelper(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111 this,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112 _typeBuilder.DefineMethod(name, attributes, returnType, Type.EmptyTypes));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116 /// Adds a new method to the class, with the given name and method signature.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118 /// <param name="name">The name of the method. name cannot contain embedded nulls. </param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119 /// <param name="attributes">The attributes of the method. </param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
120 /// <returns>The defined method.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
121 public MethodBuilderHelper DefineMethod(string name, MethodAttributes attributes)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
122 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
123 return new MethodBuilderHelper(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
124 this,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
125 _typeBuilder.DefineMethod(name, attributes, typeof(void), Type.EmptyTypes));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
126 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
127
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
128 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
129 /// Adds a new method to the class, with the given name and method signature.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
130 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
131 /// <param name="name">The name of the method. name cannot contain embedded nulls. </param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
132 /// <param name="attributes">The attributes of the method. </param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
133 /// <returns>The defined method.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
134 /// <param name="callingConvention">The calling convention of the method.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
135 public MethodBuilderHelper DefineMethod(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
136 string name,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
137 MethodAttributes attributes,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
138 CallingConventions callingConvention)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
139 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
140 return new MethodBuilderHelper(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
141 this,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
142 _typeBuilder.DefineMethod(name, attributes, callingConvention));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
143 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
144
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
145 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
146 /// Adds a new method to the class, with the given name and method signature.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
147 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
148 /// <param name="name">The name of the method. name cannot contain embedded nulls. </param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
149 /// <param name="attributes">The attributes of the method. </param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
150 /// <param name="callingConvention">The <see cref="CallingConventions">calling convention</see> of the method.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
151 /// <param name="genericArguments">Generic arguments of the method.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
152 /// <param name="returnType">The return type of the method.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
153 /// <param name="parameterTypes">The types of the parameters of the method.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
154 /// <returns>The defined generic method.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
155 public MethodBuilderHelper DefineGenericMethod(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
156 string name,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
157 MethodAttributes attributes,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
158 CallingConventions callingConvention,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
159 Type[] genericArguments,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
160 Type returnType,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
161 Type[] parameterTypes)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
162 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
163 return new MethodBuilderHelper(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
164 this,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
165 _typeBuilder.DefineMethod(name, attributes, callingConvention), genericArguments, returnType, parameterTypes);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
166 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
167
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
168
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
169 private Dictionary<MethodInfo, MethodBuilder> _overriddenMethods;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
170
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
171 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
172 /// Retrieves the map of base type methods overridden by this type.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
173 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
174 public Dictionary<MethodInfo, MethodBuilder> OverriddenMethods
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
175 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
176 get { return _overriddenMethods ?? (_overriddenMethods = new Dictionary<MethodInfo,MethodBuilder>()); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
177 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
178
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
179 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
180 /// Adds a new method to the class, with the given name and method signature.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
181 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
182 /// <param name="name">The name of the method. name cannot contain embedded nulls. </param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
183 /// <param name="methodInfoDeclaration">The method whose declaration is to be used.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
184 /// <param name="attributes">The attributes of the method. </param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
185 /// <returns>The defined method.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
186 public MethodBuilderHelper DefineMethod(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
187 string name,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
188 MethodInfo methodInfoDeclaration,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
189 MethodAttributes attributes)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
190 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
191 if (methodInfoDeclaration == null) throw new ArgumentNullException("methodInfoDeclaration");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
192
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
193 MethodBuilderHelper method;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
194 ParameterInfo[] pi = methodInfoDeclaration.GetParameters();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
195 Type[] parameters = new Type[pi.Length];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
196
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
197 for (int i = 0; i < pi.Length; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
198 parameters[i] = pi[i].ParameterType;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
199
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
200 if (methodInfoDeclaration.ContainsGenericParameters)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
201 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
202 method = DefineGenericMethod(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
203 name,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
204 attributes,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
205 methodInfoDeclaration.CallingConvention,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
206 methodInfoDeclaration.GetGenericArguments(),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
207 methodInfoDeclaration.ReturnType,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
208 parameters);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
209 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
210 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
211 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
212 method = DefineMethod(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
213 name,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
214 attributes,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
215 methodInfoDeclaration.CallingConvention,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
216 methodInfoDeclaration.ReturnType,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
217 parameters);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
218 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
219
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
220 // Compiler overrides methods only for interfaces. We do the same.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
221 // If we wanted to override virtual methods, then methods should've had
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
222 // MethodAttributes.VtableLayoutMask attribute
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
223 // and the following condition should've been used below:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
224 // if ((methodInfoDeclaration is FakeMethodInfo) == false)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
225 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
226 if (methodInfoDeclaration.DeclaringType.IsInterface
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
227 #if !SILVERLIGHT
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
228 && !(methodInfoDeclaration is FakeMethodInfo)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
229 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
230 )
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
231 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
232 OverriddenMethods.Add(methodInfoDeclaration, method.MethodBuilder);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
233 _typeBuilder.DefineMethodOverride(method.MethodBuilder, methodInfoDeclaration);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
234 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
235
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
236 method.OverriddenMethod = methodInfoDeclaration;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
237
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
238 for (int i = 0; i < pi.Length; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
239 method.MethodBuilder.DefineParameter(i + 1, pi[i].Attributes, pi[i].Name);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
240
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
241 return method;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
242 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
243
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
244 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
245 /// Adds a new method to the class, with the given name and method signature.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
246 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
247 /// <param name="name">The name of the method. name cannot contain embedded nulls. </param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
248 /// <param name="methodInfoDeclaration">The method whose declaration is to be used.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
249 /// <returns>The defined method.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
250 public MethodBuilderHelper DefineMethod(string name, MethodInfo methodInfoDeclaration)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
251 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
252 return DefineMethod(name, methodInfoDeclaration, MethodAttributes.Virtual);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
253 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
254
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
255 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
256 /// Adds a new private method to the class.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
257 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
258 /// <param name="methodInfoDeclaration">The method whose declaration is to be used.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
259 /// <returns>The defined method.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
260 public MethodBuilderHelper DefineMethod(MethodInfo methodInfoDeclaration)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
261 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
262 if (methodInfoDeclaration == null) throw new ArgumentNullException("methodInfoDeclaration");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
263
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
264 var isInterface = methodInfoDeclaration.DeclaringType.IsInterface;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
265 #if SILVERLIGHT
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
266 var isFake = false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
267 #else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
268 var isFake = methodInfoDeclaration is FakeMethodInfo;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
269 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
270
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
271 var name = isInterface && !isFake?
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
272 methodInfoDeclaration.DeclaringType.FullName + "." + methodInfoDeclaration.Name:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
273 methodInfoDeclaration.Name;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
274
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
275 var attributes =
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
276 MethodAttributes.Virtual |
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
277 MethodAttributes.HideBySig |
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
278 MethodAttributes.PrivateScope |
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
279 methodInfoDeclaration.Attributes & MethodAttributes.SpecialName;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
280
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
281 if (isInterface && !isFake)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
282 attributes |= MethodAttributes.Private;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
283 else if ((attributes & MethodAttributes.SpecialName) != 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
284 attributes |= MethodAttributes.Public;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
285 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
286 attributes |= methodInfoDeclaration.Attributes &
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
287 (MethodAttributes.Public | MethodAttributes.Private);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
288
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
289 return DefineMethod(name, methodInfoDeclaration, attributes);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
290 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
291
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
292 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
293
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
294 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
295 /// Creates a Type object for the class.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
296 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
297 /// <returns>Returns the new Type object for this class.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
298 public Type Create()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
299 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
300 return TypeBuilder.CreateType();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
301 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
302
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
303 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
304 /// Sets a custom attribute using a custom attribute type.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
305 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
306 /// <param name="attributeType">Attribute type.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
307 public void SetCustomAttribute(Type attributeType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
308 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
309 if (attributeType == null) throw new ArgumentNullException("attributeType");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
310
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
311 ConstructorInfo ci = attributeType.GetConstructor(Type.EmptyTypes);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
312 CustomAttributeBuilder caBuilder = new CustomAttributeBuilder(ci, new object[0]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
313
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
314 _typeBuilder.SetCustomAttribute(caBuilder);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
315 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
316
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
317 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
318 /// Sets a custom attribute using a custom attribute type
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
319 /// and named properties.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
320 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
321 /// <param name="attributeType">Attribute type.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
322 /// <param name="properties">Named properties of the custom attribute.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
323 /// <param name="propertyValues">Values for the named properties of the custom attribute.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
324 public void SetCustomAttribute(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
325 Type attributeType,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
326 PropertyInfo[] properties,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
327 object[] propertyValues)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
328 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
329 if (attributeType == null) throw new ArgumentNullException("attributeType");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
330
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
331 ConstructorInfo ci = attributeType.GetConstructor(Type.EmptyTypes);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
332 CustomAttributeBuilder caBuilder = new CustomAttributeBuilder(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
333 ci, new object[0], properties, propertyValues);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
334
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
335 _typeBuilder.SetCustomAttribute(caBuilder);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
336 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
337
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
338 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
339 /// Sets a custom attribute using a custom attribute type
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
340 /// and named property.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
341 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
342 /// <param name="attributeType">Attribute type.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
343 /// <param name="propertyName">A named property of the custom attribute.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
344 /// <param name="propertyValue">Value for the named property of the custom attribute.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
345 public void SetCustomAttribute(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
346 Type attributeType,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
347 string propertyName,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
348 object propertyValue)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
349 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
350 SetCustomAttribute(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
351 attributeType,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
352 new PropertyInfo[] { attributeType.GetProperty(propertyName) },
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
353 new object[] { propertyValue } );
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
354 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
355
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
356 private ConstructorBuilderHelper _typeInitializer;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
357 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
358 /// Gets the initializer for this type.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
359 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
360 public ConstructorBuilderHelper TypeInitializer
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
361 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
362 get
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
363 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
364 if (_typeInitializer == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
365 _typeInitializer = new ConstructorBuilderHelper(this, _typeBuilder.DefineTypeInitializer());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
366
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
367 return _typeInitializer;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
368 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
369 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
370
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
371 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
372 /// Returns true if the initializer for this type has a body.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
373 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
374 public bool IsTypeInitializerDefined
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
375 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
376 get { return _typeInitializer != null; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
377 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
378
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
379 private ConstructorBuilderHelper _defaultConstructor;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
380 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
381 /// Gets the default constructor for this type.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
382 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
383 public ConstructorBuilderHelper DefaultConstructor
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
384 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
385 get
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
386 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
387 if (_defaultConstructor == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
388 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
389 ConstructorBuilder builder = _typeBuilder.DefineConstructor(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
390 MethodAttributes.Public,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
391 CallingConventions.Standard,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
392 Type.EmptyTypes);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
393
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
394 _defaultConstructor = new ConstructorBuilderHelper(this, builder);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
395 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
396
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
397 return _defaultConstructor;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
398 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
399 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
400
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
401 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
402 /// Returns true if the default constructor for this type has a body.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
403 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
404 public bool IsDefaultConstructorDefined
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
405 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
406 get { return _defaultConstructor != null; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
407 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
408
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
409 private ConstructorBuilderHelper _initConstructor;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
410 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
411 /// Gets the init context constructor for this type.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
412 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
413 public ConstructorBuilderHelper InitConstructor
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
414 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
415 get
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
416 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
417 if (_initConstructor == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
418 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
419 ConstructorBuilder builder = _typeBuilder.DefineConstructor(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
420 MethodAttributes.Public,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
421 CallingConventions.Standard,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
422 new Type[] { typeof(InitContext) });
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
423
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
424 _initConstructor = new ConstructorBuilderHelper(this, builder);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
425 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
426
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
427 return _initConstructor;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
428 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
429 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
430
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
431 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
432 /// Returns true if a constructor with parameter of <see cref="InitContext"/> for this type has a body.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
433 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
434 public bool IsInitConstructorDefined
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
435 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
436 get { return _initConstructor != null; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
437 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
438
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
439 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
440 /// Adds a new field to the class, with the given name, attributes and field type.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
441 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
442 /// <param name="fieldName">The name of the field. <paramref name="fieldName"/> cannot contain embedded nulls.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
443 /// <param name="type">The type of the field.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
444 /// <param name="attributes">The attributes of the field.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
445 /// <returns>The defined field.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
446 public FieldBuilder DefineField(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
447 string fieldName,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
448 Type type,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
449 FieldAttributes attributes)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
450 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
451 return _typeBuilder.DefineField(fieldName, type, attributes);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
452 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
453
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
454 #region DefineConstructor Overrides
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
455
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
456 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
457 /// Adds a new public constructor to the class, with the given parameters.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
458 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
459 /// <param name="parameterTypes">The types of the parameters of the method.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
460 /// <returns>The defined constructor.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
461 public ConstructorBuilderHelper DefinePublicConstructor(params Type[] parameterTypes)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
462 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
463 return new ConstructorBuilderHelper(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
464 this,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
465 _typeBuilder.DefineConstructor(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
466 MethodAttributes.Public, CallingConventions.Standard, parameterTypes));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
467 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
468
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
469 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
470 /// Adds a new constructor to the class, with the given attributes and parameters.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
471 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
472 /// <param name="attributes">The attributes of the field.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
473 /// <param name="callingConvention">The <see cref="CallingConventions">calling convention</see> of the method.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
474 /// <param name="parameterTypes">The types of the parameters of the method.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
475 /// <returns>The defined constructor.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
476 public ConstructorBuilderHelper DefineConstructor(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
477 MethodAttributes attributes,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
478 CallingConventions callingConvention,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
479 params Type[] parameterTypes)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
480 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
481 return new ConstructorBuilderHelper(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
482 this,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
483 _typeBuilder.DefineConstructor(attributes, callingConvention, parameterTypes));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
484 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
485
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
486 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
487
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
488 #region DefineNestedType Overrides
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
489
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
490 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
491 /// Defines a nested type given its name..
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
492 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
493 /// <param name="name">The short name of the type.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
494 /// <returns>Returns the created <see cref="TypeBuilderHelper"/>.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
495 /// <seealso cref="System.Reflection.Emit.TypeBuilder.DefineNestedType(string)">
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
496 /// TypeBuilder.DefineNestedType Method</seealso>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
497 public TypeBuilderHelper DefineNestedType(string name)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
498 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
499 return new TypeBuilderHelper(_assembly, _typeBuilder.DefineNestedType(name));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
500 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
501
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
502 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
503 /// Defines a public nested type given its name and the type that it extends.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
504 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
505 /// <param name="name">The short name of the type.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
506 /// <param name="parent">The type that the nested type extends.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
507 /// <returns>Returns the created <see cref="TypeBuilderHelper"/>.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
508 /// <seealso cref="System.Reflection.Emit.TypeBuilder.DefineNestedType(string,TypeAttributes,Type)">
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
509 /// TypeBuilder.DefineNestedType Method</seealso>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
510 public TypeBuilderHelper DefineNestedType(string name, Type parent)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
511 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
512 return new TypeBuilderHelper(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
513 _assembly,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
514 _typeBuilder.DefineNestedType(name, TypeAttributes.NestedPublic, parent));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
515 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
516
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
517 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
518 /// Defines a nested type given its name, attributes, and the type that it extends.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
519 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
520 /// <param name="name">The short name of the type.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
521 /// <param name="attributes">The attributes of the type.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
522 /// <param name="parent">The type that the nested type extends.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
523 /// <returns>Returns the created <see cref="TypeBuilderHelper"/>.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
524 /// <seealso cref="System.Reflection.Emit.TypeBuilder.DefineNestedType(string,TypeAttributes,Type)">
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
525 /// TypeBuilder.DefineNestedType Method</seealso>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
526 public TypeBuilderHelper DefineNestedType(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
527 string name,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
528 TypeAttributes attributes,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
529 Type parent)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
530 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
531 return new TypeBuilderHelper(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
532 _assembly,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
533 _typeBuilder.DefineNestedType(name, attributes, parent));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
534 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
535
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
536 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
537 /// Defines a public nested type given its name, the type that it extends, and the interfaces that it implements.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
538 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
539 /// <param name="name">The short name of the type.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
540 /// <param name="parent">The type that the nested type extends.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
541 /// <param name="interfaces">The interfaces that the nested type implements.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
542 /// <returns>Returns the created <see cref="TypeBuilderHelper"/>.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
543 /// <seealso cref="System.Reflection.Emit.TypeBuilder.DefineNestedType(string,TypeAttributes,Type,Type[])">
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
544 /// TypeBuilder.DefineNestedType Method</seealso>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
545 public TypeBuilderHelper DefineNestedType(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
546 string name,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
547 Type parent,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
548 params Type[] interfaces)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
549 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
550 return new TypeBuilderHelper(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
551 _assembly,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
552 _typeBuilder.DefineNestedType(name, TypeAttributes.NestedPublic, parent, interfaces));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
553 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
554
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
555 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
556 /// Defines a nested type given its name, attributes, the type that it extends, and the interfaces that it implements.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
557 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
558 /// <param name="name">The short name of the type.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
559 /// <param name="attributes">The attributes of the type.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
560 /// <param name="parent">The type that the nested type extends.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
561 /// <param name="interfaces">The interfaces that the nested type implements.</param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
562 /// <returns>Returns the created <see cref="TypeBuilderHelper"/>.</returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
563 /// <seealso cref="System.Reflection.Emit.ModuleBuilder.DefineType(string,TypeAttributes,Type,Type[])">ModuleBuilder.DefineType Method</seealso>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
564 public TypeBuilderHelper DefineNestedType(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
565 string name,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
566 TypeAttributes attributes,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
567 Type parent,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
568 params Type[] interfaces)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
569 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
570 return new TypeBuilderHelper(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
571 _assembly,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
572 _typeBuilder.DefineNestedType(name, attributes, parent, interfaces));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
573 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
574
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
575 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
576
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
577 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
578 }