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;
39 using System.Runtime.InteropServices;
41 namespace System.Reflection.Emit {
43 [ComDefaultInterface (typeof (_EnumBuilder))]
44 [ClassInterface (ClassInterfaceType.None)]
45 public sealed class EnumBuilder : Type, _EnumBuilder {
46 private TypeBuilder _tb;
47 private FieldBuilder _underlyingField;
48 private Type _underlyingType;
50 internal EnumBuilder (ModuleBuilder mb, string name, TypeAttributes visibility, Type underlyingType)
52 _tb = new TypeBuilder (mb, name, (visibility | TypeAttributes.Sealed),
53 typeof(Enum), null, PackingSize.Unspecified, 0, null);
54 _underlyingType = underlyingType;
55 _underlyingField = _tb.DefineField ("value__", underlyingType,
56 (FieldAttributes.SpecialName | FieldAttributes.Private | FieldAttributes.RTSpecialName));
57 setup_enum_type (_tb);
60 internal TypeBuilder GetTypeBuilder ()
65 internal override Type InternalResolve ()
67 return _tb.InternalResolve ();
71 public override Assembly Assembly {
77 public override string AssemblyQualifiedName {
79 return _tb.AssemblyQualifiedName;
83 public override Type BaseType {
89 public override Type DeclaringType {
91 return _tb.DeclaringType;
95 public override string FullName {
101 public override Guid GUID {
107 public override Module Module {
113 public override string Name {
119 public override string Namespace {
121 return _tb.Namespace;
125 public override Type ReflectedType {
127 return _tb.ReflectedType;
131 public override RuntimeTypeHandle TypeHandle {
133 return _tb.TypeHandle;
137 public TypeToken TypeToken {
139 return _tb.TypeToken;
143 public FieldBuilder UnderlyingField {
145 return _underlyingField;
149 public override Type UnderlyingSystemType {
151 return _underlyingType;
155 public Type CreateType ()
157 Type res = _tb.CreateType ();
162 public override Type GetEnumUnderlyingType ()
164 return _underlyingType;
168 [MethodImplAttribute(MethodImplOptions.InternalCall)]
169 private extern void setup_enum_type (Type t);
171 public FieldBuilder DefineLiteral (string literalName, object literalValue)
173 Type fieldType = this;
174 FieldBuilder fieldBuilder = _tb.DefineField (literalName,
175 fieldType, (FieldAttributes.Literal |
176 (FieldAttributes.Static | FieldAttributes.Public)));
177 fieldBuilder.SetConstant (literalValue);
181 protected override TypeAttributes GetAttributeFlagsImpl ()
186 protected override ConstructorInfo GetConstructorImpl (
187 BindingFlags bindingAttr, Binder binder, CallingConventions callConvention,
188 Type[] types, ParameterModifier[] modifiers)
190 return _tb.GetConstructor (bindingAttr, binder, callConvention, types,
195 public override ConstructorInfo[] GetConstructors(BindingFlags bindingAttr)
197 return _tb.GetConstructors (bindingAttr);
200 public override object[] GetCustomAttributes(bool inherit)
202 return _tb.GetCustomAttributes (inherit);
205 public override object[] GetCustomAttributes(Type attributeType, bool inherit)
207 return _tb.GetCustomAttributes (attributeType, inherit);
210 public override Type GetElementType()
212 return _tb.GetElementType ();
215 public override EventInfo GetEvent( string name, BindingFlags bindingAttr)
217 return _tb.GetEvent (name, bindingAttr);
220 public override EventInfo[] GetEvents()
222 return _tb.GetEvents ();
225 public override EventInfo[] GetEvents( BindingFlags bindingAttr)
227 return _tb.GetEvents (bindingAttr);
230 public override FieldInfo GetField( string name, BindingFlags bindingAttr)
232 return _tb.GetField (name, bindingAttr);
235 public override FieldInfo[] GetFields( BindingFlags bindingAttr)
237 return _tb.GetFields (bindingAttr);
240 public override Type GetInterface (string name, bool ignoreCase)
242 return _tb.GetInterface (name, ignoreCase);
246 public override InterfaceMapping GetInterfaceMap (Type interfaceType)
248 return _tb.GetInterfaceMap (interfaceType);
251 public override Type[] GetInterfaces()
253 return _tb.GetInterfaces ();
256 public override MemberInfo[] GetMember (string name, MemberTypes type, BindingFlags bindingAttr)
258 return _tb.GetMember (name, type, bindingAttr);
261 public override MemberInfo[] GetMembers(BindingFlags bindingAttr)
263 return _tb.GetMembers (bindingAttr);
266 protected override MethodInfo GetMethodImpl (
267 string name, BindingFlags bindingAttr, Binder binder,
268 CallingConventions callConvention, Type[] types,
269 ParameterModifier[] modifiers)
272 return _tb.GetMethod (name, bindingAttr);
275 return _tb.GetMethod (name, bindingAttr, binder,
276 callConvention, types, modifiers);
279 public override MethodInfo[] GetMethods (BindingFlags bindingAttr)
281 return _tb.GetMethods (bindingAttr);
284 public override Type GetNestedType (string name, BindingFlags bindingAttr)
286 return _tb.GetNestedType (name, bindingAttr);
289 public override Type[] GetNestedTypes (BindingFlags bindingAttr)
291 return _tb.GetNestedTypes (bindingAttr);
294 public override PropertyInfo[] GetProperties (BindingFlags bindingAttr)
296 return _tb.GetProperties (bindingAttr);
299 protected override PropertyInfo GetPropertyImpl (
300 string name, BindingFlags bindingAttr, Binder binder,
301 Type returnType, Type[] types,
302 ParameterModifier[] modifiers)
304 throw CreateNotSupportedException ();
307 protected override bool HasElementTypeImpl ()
309 return _tb.HasElementType;
312 public override object InvokeMember (
313 string name, BindingFlags invokeAttr, Binder binder,
314 object target, object[] args,
315 ParameterModifier[] modifiers, CultureInfo culture,
316 string[] namedParameters)
318 return _tb.InvokeMember (name, invokeAttr, binder, target,
319 args, modifiers, culture, namedParameters);
322 protected override bool IsArrayImpl()
327 protected override bool IsByRefImpl()
332 protected override bool IsCOMObjectImpl()
337 protected override bool IsPointerImpl()
342 protected override bool IsPrimitiveImpl()
347 protected override bool IsValueTypeImpl()
352 public override bool IsDefined (Type attributeType, bool inherit)
354 return _tb.IsDefined (attributeType, inherit);
357 public override Type MakeArrayType ()
359 return new ArrayType (this, 0);
362 public override Type MakeArrayType (int rank)
365 throw new IndexOutOfRangeException ();
366 return new ArrayType (this, rank);
369 public override Type MakeByRefType ()
371 return new ByRefType (this);
374 public override Type MakePointerType ()
376 return new PointerType (this);
379 public void SetCustomAttribute (CustomAttributeBuilder customBuilder)
381 _tb.SetCustomAttribute (customBuilder);
385 public void SetCustomAttribute (ConstructorInfo con, byte[] binaryAttribute)
387 SetCustomAttribute (new CustomAttributeBuilder (con, binaryAttribute));
390 private Exception CreateNotSupportedException ()
392 return new NotSupportedException ("The invoked member is not supported in a dynamic module.");
395 void _EnumBuilder.GetIDsOfNames ([In] ref Guid riid, IntPtr rgszNames, uint cNames, uint lcid, IntPtr rgDispId)
397 throw new NotImplementedException ();
400 void _EnumBuilder.GetTypeInfo (uint iTInfo, uint lcid, IntPtr ppTInfo)
402 throw new NotImplementedException ();
405 void _EnumBuilder.GetTypeInfoCount (out uint pcTInfo)
407 throw new NotImplementedException ();
410 void _EnumBuilder.Invoke (uint dispIdMember, [In] ref Guid riid, uint lcid, short wFlags, IntPtr pDispParams, IntPtr pVarResult, IntPtr pExcepInfo, IntPtr puArgErr)
412 throw new NotImplementedException ();
415 internal override bool IsUserType {