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
36 using System.Reflection;
37 using System.Reflection.Emit;
38 using System.Globalization;
39 using System.Runtime.CompilerServices;
40 using System.Runtime.InteropServices;
42 namespace System.Reflection.Emit {
44 [ComDefaultInterface (typeof (_EnumBuilder))]
45 [ClassInterface (ClassInterfaceType.None)]
46 public sealed class EnumBuilder : Type, _EnumBuilder {
47 private TypeBuilder _tb;
48 private FieldBuilder _underlyingField;
49 private Type _underlyingType;
51 internal EnumBuilder (ModuleBuilder mb, string name, TypeAttributes visibility, Type underlyingType)
53 _tb = new TypeBuilder (mb, name, (visibility | TypeAttributes.Sealed),
54 typeof(Enum), null, PackingSize.Unspecified, 0, null);
55 _underlyingType = underlyingType;
56 _underlyingField = _tb.DefineField ("value__", underlyingType,
57 (FieldAttributes.SpecialName | FieldAttributes.Private | FieldAttributes.RTSpecialName));
58 setup_enum_type (_tb);
61 internal TypeBuilder GetTypeBuilder ()
66 internal override Type InternalResolve ()
68 return _tb.InternalResolve ();
72 public override Assembly Assembly {
78 public override string AssemblyQualifiedName {
80 return _tb.AssemblyQualifiedName;
84 public override Type BaseType {
90 public override Type DeclaringType {
92 return _tb.DeclaringType;
96 public override string FullName {
102 public override Guid GUID {
108 public override Module Module {
114 public override string Name {
120 public override string Namespace {
122 return _tb.Namespace;
126 public override Type ReflectedType {
128 return _tb.ReflectedType;
132 public override RuntimeTypeHandle TypeHandle {
134 return _tb.TypeHandle;
138 public TypeToken TypeToken {
140 return _tb.TypeToken;
144 public FieldBuilder UnderlyingField {
146 return _underlyingField;
150 public override Type UnderlyingSystemType {
152 return _underlyingType;
156 public Type CreateType ()
158 Type res = _tb.CreateType ();
163 public override Type GetEnumUnderlyingType ()
165 return _underlyingType;
169 [MethodImplAttribute(MethodImplOptions.InternalCall)]
170 private extern void setup_enum_type (Type t);
172 public FieldBuilder DefineLiteral (string literalName, object literalValue)
174 Type fieldType = this;
175 FieldBuilder fieldBuilder = _tb.DefineField (literalName,
176 fieldType, (FieldAttributes.Literal |
177 (FieldAttributes.Static | FieldAttributes.Public)));
178 fieldBuilder.SetConstant (literalValue);
182 protected override TypeAttributes GetAttributeFlagsImpl ()
187 protected override ConstructorInfo GetConstructorImpl (
188 BindingFlags bindingAttr, Binder binder, CallingConventions callConvention,
189 Type[] types, ParameterModifier[] modifiers)
191 return _tb.GetConstructor (bindingAttr, binder, callConvention, types,
196 public override ConstructorInfo[] GetConstructors(BindingFlags bindingAttr)
198 return _tb.GetConstructors (bindingAttr);
201 public override object[] GetCustomAttributes(bool inherit)
203 return _tb.GetCustomAttributes (inherit);
206 public override object[] GetCustomAttributes(Type attributeType, bool inherit)
208 return _tb.GetCustomAttributes (attributeType, inherit);
211 public override Type GetElementType()
213 return _tb.GetElementType ();
216 public override EventInfo GetEvent( string name, BindingFlags bindingAttr)
218 return _tb.GetEvent (name, bindingAttr);
221 public override EventInfo[] GetEvents()
223 return _tb.GetEvents ();
226 public override EventInfo[] GetEvents( BindingFlags bindingAttr)
228 return _tb.GetEvents (bindingAttr);
231 public override FieldInfo GetField( string name, BindingFlags bindingAttr)
233 return _tb.GetField (name, bindingAttr);
236 public override FieldInfo[] GetFields( BindingFlags bindingAttr)
238 return _tb.GetFields (bindingAttr);
241 public override Type GetInterface (string name, bool ignoreCase)
243 return _tb.GetInterface (name, ignoreCase);
247 public override InterfaceMapping GetInterfaceMap (Type interfaceType)
249 return _tb.GetInterfaceMap (interfaceType);
252 public override Type[] GetInterfaces()
254 return _tb.GetInterfaces ();
257 public override MemberInfo[] GetMember (string name, MemberTypes type, BindingFlags bindingAttr)
259 return _tb.GetMember (name, type, bindingAttr);
262 public override MemberInfo[] GetMembers(BindingFlags bindingAttr)
264 return _tb.GetMembers (bindingAttr);
267 protected override MethodInfo GetMethodImpl (
268 string name, BindingFlags bindingAttr, Binder binder,
269 CallingConventions callConvention, Type[] types,
270 ParameterModifier[] modifiers)
273 return _tb.GetMethod (name, bindingAttr);
276 return _tb.GetMethod (name, bindingAttr, binder,
277 callConvention, types, modifiers);
280 public override MethodInfo[] GetMethods (BindingFlags bindingAttr)
282 return _tb.GetMethods (bindingAttr);
285 public override Type GetNestedType (string name, BindingFlags bindingAttr)
287 return _tb.GetNestedType (name, bindingAttr);
290 public override Type[] GetNestedTypes (BindingFlags bindingAttr)
292 return _tb.GetNestedTypes (bindingAttr);
295 public override PropertyInfo[] GetProperties (BindingFlags bindingAttr)
297 return _tb.GetProperties (bindingAttr);
300 protected override PropertyInfo GetPropertyImpl (
301 string name, BindingFlags bindingAttr, Binder binder,
302 Type returnType, Type[] types,
303 ParameterModifier[] modifiers)
305 throw CreateNotSupportedException ();
308 protected override bool HasElementTypeImpl ()
310 return _tb.HasElementType;
313 public override object InvokeMember (
314 string name, BindingFlags invokeAttr, Binder binder,
315 object target, object[] args,
316 ParameterModifier[] modifiers, CultureInfo culture,
317 string[] namedParameters)
319 return _tb.InvokeMember (name, invokeAttr, binder, target,
320 args, modifiers, culture, namedParameters);
323 protected override bool IsArrayImpl()
328 protected override bool IsByRefImpl()
333 protected override bool IsCOMObjectImpl()
338 protected override bool IsPointerImpl()
343 protected override bool IsPrimitiveImpl()
348 protected override bool IsValueTypeImpl()
353 public override bool IsDefined (Type attributeType, bool inherit)
355 return _tb.IsDefined (attributeType, inherit);
358 public override Type MakeArrayType ()
360 return new ArrayType (this, 0);
363 public override Type MakeArrayType (int rank)
366 throw new IndexOutOfRangeException ();
367 return new ArrayType (this, rank);
370 public override Type MakeByRefType ()
372 return new ByRefType (this);
375 public override Type MakePointerType ()
377 return new PointerType (this);
380 public void SetCustomAttribute (CustomAttributeBuilder customBuilder)
382 _tb.SetCustomAttribute (customBuilder);
386 public void SetCustomAttribute (ConstructorInfo con, byte[] binaryAttribute)
388 SetCustomAttribute (new CustomAttributeBuilder (con, binaryAttribute));
391 private Exception CreateNotSupportedException ()
393 return new NotSupportedException ("The invoked member is not supported in a dynamic module.");
396 void _EnumBuilder.GetIDsOfNames ([In] ref Guid riid, IntPtr rgszNames, uint cNames, uint lcid, IntPtr rgDispId)
398 throw new NotImplementedException ();
401 void _EnumBuilder.GetTypeInfo (uint iTInfo, uint lcid, IntPtr ppTInfo)
403 throw new NotImplementedException ();
406 void _EnumBuilder.GetTypeInfoCount (out uint pcTInfo)
408 throw new NotImplementedException ();
411 void _EnumBuilder.Invoke (uint dispIdMember, [In] ref Guid riid, uint lcid, short wFlags, IntPtr pDispParams, IntPtr pVarResult, IntPtr pExcepInfo, IntPtr puArgErr)
413 throw new NotImplementedException ();
416 internal override bool IsUserType {