3 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
5 // Permission is hereby granted, free of charge, to any person obtaining
6 // a copy of this software and associated documentation files (the
7 // "Software"), to deal in the Software without restriction, including
8 // without limitation the rights to use, copy, modify, merge, publish,
9 // distribute, sublicense, and/or sell copies of the Software, and to
10 // permit persons to whom the Software is furnished to do so, subject to
11 // the following conditions:
13 // The above copyright notice and this permission notice shall be
14 // included in all copies or substantial portions of the Software.
16 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26 // System.Reflection.Emit/EnumBuilder.cs
29 // Paolo Molaro (lupus@ximian.com)
31 // (C) 2001 Ximian, Inc. http://www.ximian.com
35 using System.Reflection;
36 using System.Reflection.Emit;
37 using System.Globalization;
38 using System.Runtime.CompilerServices;
40 namespace System.Reflection.Emit {
41 public sealed class EnumBuilder : Type {
42 private CustomAttributeBuilder[] cattrs;
43 private TypeBuilder _tb;
44 private FieldBuilder _underlyingField;
45 private Type _underlyingType;
47 internal EnumBuilder (ModuleBuilder mb, string name, TypeAttributes visibility, Type underlyingType)
49 _tb = new TypeBuilder (mb, name, (visibility | TypeAttributes.Sealed),
50 typeof(Enum), null, PackingSize.Unspecified, 0, null);
51 _underlyingType = underlyingType;
52 _underlyingField = _tb.DefineField ("value__", underlyingType,
53 (FieldAttributes.SpecialName | FieldAttributes.Private));
54 setup_enum_type (_tb);
57 public override Assembly Assembly {
63 public override string AssemblyQualifiedName {
65 return _tb.AssemblyQualifiedName;
69 public override Type BaseType {
75 public override Type DeclaringType {
77 return _tb.DeclaringType;
81 public override string FullName {
87 public override Guid GUID {
93 public override Module Module {
99 public override string Name {
105 public override string Namespace {
107 return _tb.Namespace;
111 public override Type ReflectedType {
113 return _tb.ReflectedType;
117 public override RuntimeTypeHandle TypeHandle {
119 return _tb.TypeHandle;
123 public TypeToken TypeToken {
125 return _tb.TypeToken;
129 public FieldBuilder UnderlyingField {
131 return _underlyingField;
135 public override Type UnderlyingSystemType {
137 return _underlyingType;
141 public Type CreateType ()
143 Type res = _tb.CreateType ();
147 [MethodImplAttribute(MethodImplOptions.InternalCall)]
148 private extern void setup_enum_type (Type t);
150 public FieldBuilder DefineLiteral (string literalName, object literalValue)
152 FieldBuilder fieldBuilder = _tb.DefineField (literalName,
153 _underlyingType, (FieldAttributes.Literal |
154 (FieldAttributes.Static | FieldAttributes.Public)));
155 fieldBuilder.SetConstant (literalValue);
159 protected override TypeAttributes GetAttributeFlagsImpl ()
164 protected override ConstructorInfo GetConstructorImpl (
165 BindingFlags bindingAttr, Binder binder, CallingConventions cc,
166 Type[] types, ParameterModifier[] modifiers)
168 return _tb.GetConstructor (bindingAttr, binder, cc, types,
172 public override ConstructorInfo[] GetConstructors(BindingFlags bindingAttr)
174 return _tb.GetConstructors (bindingAttr);
177 public override object[] GetCustomAttributes(bool inherit)
179 return _tb.GetCustomAttributes (inherit);
182 public override object[] GetCustomAttributes(Type attributeType, bool inherit)
184 return _tb.GetCustomAttributes (attributeType, inherit);
187 public override Type GetElementType()
189 return _tb.GetElementType ();
192 public override EventInfo GetEvent( string name, BindingFlags bindingAttr)
194 return _tb.GetEvent (name, bindingAttr);
197 public override EventInfo[] GetEvents()
199 return _tb.GetEvents ();
202 public override EventInfo[] GetEvents( BindingFlags bindingAttr)
204 return _tb.GetEvents (bindingAttr);
207 public override FieldInfo GetField( string name, BindingFlags bindingAttr)
209 return _tb.GetField (name, bindingAttr);
212 public override FieldInfo[] GetFields( BindingFlags bindingAttr)
214 return _tb.GetFields (bindingAttr);
217 public override Type GetInterface (string name, bool ignoreCase)
219 return _tb.GetInterface (name, ignoreCase);
222 public override InterfaceMapping GetInterfaceMap (Type interfaceType)
224 return _tb.GetInterfaceMap (interfaceType);
227 public override Type[] GetInterfaces()
229 return _tb.GetInterfaces ();
232 public override MemberInfo[] GetMember (string name, MemberTypes type, BindingFlags bindingAttr)
234 return _tb.GetMember (name, type, bindingAttr);
237 public override MemberInfo[] GetMembers(BindingFlags bindingAttr)
239 return _tb.GetMembers (bindingAttr);
242 protected override MethodInfo GetMethodImpl (
243 string name, BindingFlags bindingAttr, Binder binder,
244 CallingConventions callConvention, Type[] types,
245 ParameterModifier[] modifiers)
248 return _tb.GetMethod (name, bindingAttr);
251 return _tb.GetMethod (name, bindingAttr, binder,
252 callConvention, types, modifiers);
255 public override MethodInfo[] GetMethods (BindingFlags bindingAttr)
257 return _tb.GetMethods (bindingAttr);
260 public override Type GetNestedType (string name, BindingFlags bindingAttr)
262 return _tb.GetNestedType (name, bindingAttr);
265 public override Type[] GetNestedTypes (BindingFlags bindingAttr)
267 return _tb.GetNestedTypes (bindingAttr);
270 public override PropertyInfo[] GetProperties (BindingFlags bindingAttr)
272 return _tb.GetProperties (bindingAttr);
275 protected override PropertyInfo GetPropertyImpl (
276 string name, BindingFlags bindingAttr, Binder binder,
277 Type returnType, Type[] types,
278 ParameterModifier[] modifiers)
280 throw CreateNotSupportedException ();
283 protected override bool HasElementTypeImpl ()
285 return _tb.HasElementType;
288 public override object InvokeMember (
289 string name, BindingFlags invokeAttr, Binder binder,
290 object target, object[] args,
291 ParameterModifier[] modifiers, CultureInfo culture,
292 string[] namedParameters)
294 return _tb.InvokeMember (name, invokeAttr, binder, target,
295 args, modifiers, culture, namedParameters);
298 protected override bool IsArrayImpl()
303 protected override bool IsByRefImpl()
308 protected override bool IsCOMObjectImpl()
313 protected override bool IsPointerImpl()
318 protected override bool IsPrimitiveImpl()
323 protected override bool IsValueTypeImpl()
328 public override bool IsDefined (Type attributeType, bool inherit)
330 return _tb.IsDefined (attributeType, inherit);
333 public void SetCustomAttribute (CustomAttributeBuilder customBuilder)
335 if (cattrs != null) {
336 CustomAttributeBuilder[] new_array = new CustomAttributeBuilder [cattrs.Length + 1];
337 cattrs.CopyTo (new_array, 0);
338 new_array [cattrs.Length] = customBuilder;
341 cattrs = new CustomAttributeBuilder [1];
342 cattrs [0] = customBuilder;
346 public void SetCustomAttribute (ConstructorInfo con, byte[] binaryAttribute)
348 SetCustomAttribute (new CustomAttributeBuilder (con, binaryAttribute));
351 #if NET_2_0 || BOOTSTRAP_NET_2_0
353 public override Type[] GetGenericArguments ()
355 throw new NotImplementedException ();
359 public override bool HasGenericArguments {
361 throw new NotImplementedException ();
366 public override bool ContainsGenericParameters {
368 throw new NotImplementedException ();
373 public override bool IsGenericParameter {
375 throw new NotImplementedException ();
380 public override int GenericParameterPosition {
382 throw new NotImplementedException ();
387 public override MethodInfo DeclaringMethod {
389 throw new NotImplementedException ();
394 private Exception CreateNotSupportedException ()
396 return new NotSupportedException ("The invoked member is not supported in a dynamic module.");