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 :
50 private TypeBuilder _tb;
51 private FieldBuilder _underlyingField;
52 private Type _underlyingType;
54 internal EnumBuilder (ModuleBuilder mb, string name, TypeAttributes visibility, Type underlyingType)
56 _tb = new TypeBuilder (mb, name, (visibility | TypeAttributes.Sealed),
57 typeof(Enum), null, PackingSize.Unspecified, 0, null);
58 _underlyingType = underlyingType;
59 _underlyingField = _tb.DefineField ("value__", underlyingType,
60 (FieldAttributes.SpecialName | FieldAttributes.Private | FieldAttributes.RTSpecialName));
61 setup_enum_type (_tb);
64 internal TypeBuilder GetTypeBuilder ()
69 internal override Type InternalResolve ()
71 return _tb.InternalResolve ();
75 public override Assembly Assembly {
81 public override string AssemblyQualifiedName {
83 return _tb.AssemblyQualifiedName;
87 public override Type BaseType {
93 public override Type DeclaringType {
95 return _tb.DeclaringType;
99 public override string FullName {
105 public override Guid GUID {
111 public override Module Module {
117 public override string Name {
123 public override string Namespace {
125 return _tb.Namespace;
129 public override Type ReflectedType {
131 return _tb.ReflectedType;
135 public override RuntimeTypeHandle TypeHandle {
137 return _tb.TypeHandle;
141 public TypeToken TypeToken {
143 return _tb.TypeToken;
147 public FieldBuilder UnderlyingField {
149 return _underlyingField;
153 public override Type UnderlyingSystemType {
155 return _underlyingType;
159 public Type CreateType ()
161 Type res = _tb.CreateType ();
165 public override Type GetEnumUnderlyingType ()
167 return _underlyingType;
170 [MethodImplAttribute(MethodImplOptions.InternalCall)]
171 private extern void setup_enum_type (Type t);
173 public FieldBuilder DefineLiteral (string literalName, object literalValue)
175 Type fieldType = this;
176 FieldBuilder fieldBuilder = _tb.DefineField (literalName,
177 fieldType, (FieldAttributes.Literal |
178 (FieldAttributes.Static | FieldAttributes.Public)));
179 fieldBuilder.SetConstant (literalValue);
183 protected override TypeAttributes GetAttributeFlagsImpl ()
188 protected override ConstructorInfo GetConstructorImpl (
189 BindingFlags bindingAttr, Binder binder, CallingConventions callConvention,
190 Type[] types, ParameterModifier[] modifiers)
192 return _tb.GetConstructor (bindingAttr, binder, callConvention, types,
197 public override ConstructorInfo[] GetConstructors(BindingFlags bindingAttr)
199 return _tb.GetConstructors (bindingAttr);
202 public override object[] GetCustomAttributes(bool inherit)
204 return _tb.GetCustomAttributes (inherit);
207 public override object[] GetCustomAttributes(Type attributeType, bool inherit)
209 return _tb.GetCustomAttributes (attributeType, inherit);
212 public override Type GetElementType()
214 return _tb.GetElementType ();
217 public override EventInfo GetEvent( string name, BindingFlags bindingAttr)
219 return _tb.GetEvent (name, bindingAttr);
222 public override EventInfo[] GetEvents()
224 return _tb.GetEvents ();
227 public override EventInfo[] GetEvents( BindingFlags bindingAttr)
229 return _tb.GetEvents (bindingAttr);
232 public override FieldInfo GetField( string name, BindingFlags bindingAttr)
234 return _tb.GetField (name, bindingAttr);
237 public override FieldInfo[] GetFields( BindingFlags bindingAttr)
239 return _tb.GetFields (bindingAttr);
242 public override Type GetInterface (string name, bool ignoreCase)
244 return _tb.GetInterface (name, ignoreCase);
248 public override InterfaceMapping GetInterfaceMap (Type interfaceType)
250 return _tb.GetInterfaceMap (interfaceType);
253 public override Type[] GetInterfaces()
255 return _tb.GetInterfaces ();
258 public override MemberInfo[] GetMember (string name, MemberTypes type, BindingFlags bindingAttr)
260 return _tb.GetMember (name, type, bindingAttr);
263 public override MemberInfo[] GetMembers(BindingFlags bindingAttr)
265 return _tb.GetMembers (bindingAttr);
268 protected override MethodInfo GetMethodImpl (
269 string name, BindingFlags bindingAttr, Binder binder,
270 CallingConventions callConvention, Type[] types,
271 ParameterModifier[] modifiers)
274 return _tb.GetMethod (name, bindingAttr);
277 return _tb.GetMethod (name, bindingAttr, binder,
278 callConvention, types, modifiers);
281 public override MethodInfo[] GetMethods (BindingFlags bindingAttr)
283 return _tb.GetMethods (bindingAttr);
286 public override Type GetNestedType (string name, BindingFlags bindingAttr)
288 return _tb.GetNestedType (name, bindingAttr);
291 public override Type[] GetNestedTypes (BindingFlags bindingAttr)
293 return _tb.GetNestedTypes (bindingAttr);
296 public override PropertyInfo[] GetProperties (BindingFlags bindingAttr)
298 return _tb.GetProperties (bindingAttr);
301 protected override PropertyInfo GetPropertyImpl (
302 string name, BindingFlags bindingAttr, Binder binder,
303 Type returnType, Type[] types,
304 ParameterModifier[] modifiers)
306 throw CreateNotSupportedException ();
309 protected override bool HasElementTypeImpl ()
311 return _tb.HasElementType;
314 public override object InvokeMember (
315 string name, BindingFlags invokeAttr, Binder binder,
316 object target, object[] args,
317 ParameterModifier[] modifiers, CultureInfo culture,
318 string[] namedParameters)
320 return _tb.InvokeMember (name, invokeAttr, binder, target,
321 args, modifiers, culture, namedParameters);
324 protected override bool IsArrayImpl()
329 protected override bool IsByRefImpl()
334 protected override bool IsCOMObjectImpl()
339 protected override bool IsPointerImpl()
344 protected override bool IsPrimitiveImpl()
349 protected override bool IsValueTypeImpl()
354 public override bool IsDefined (Type attributeType, bool inherit)
356 return _tb.IsDefined (attributeType, inherit);
359 public override Type MakeArrayType ()
361 return new ArrayType (this, 0);
364 public override Type MakeArrayType (int rank)
367 throw new IndexOutOfRangeException ();
368 return new ArrayType (this, rank);
371 public override Type MakeByRefType ()
373 return new ByRefType (this);
376 public override Type MakePointerType ()
378 return new PointerType (this);
381 public void SetCustomAttribute (CustomAttributeBuilder customBuilder)
383 _tb.SetCustomAttribute (customBuilder);
387 public void SetCustomAttribute (ConstructorInfo con, byte[] binaryAttribute)
389 SetCustomAttribute (new CustomAttributeBuilder (con, binaryAttribute));
392 private Exception CreateNotSupportedException ()
394 return new NotSupportedException ("The invoked member is not supported in a dynamic module.");
397 void _EnumBuilder.GetIDsOfNames ([In] ref Guid riid, IntPtr rgszNames, uint cNames, uint lcid, IntPtr rgDispId)
399 throw new NotImplementedException ();
402 void _EnumBuilder.GetTypeInfo (uint iTInfo, uint lcid, IntPtr ppTInfo)
404 throw new NotImplementedException ();
407 void _EnumBuilder.GetTypeInfoCount (out uint pcTInfo)
409 throw new NotImplementedException ();
412 void _EnumBuilder.Invoke (uint dispIdMember, [In] ref Guid riid, uint lcid, short wFlags, IntPtr pDispParams, IntPtr pVarResult, IntPtr pExcepInfo, IntPtr puArgErr)
414 throw new NotImplementedException ();
417 internal override bool IsUserType {
423 public override bool IsConstructedGenericType {
424 get { return false; }
427 public override bool IsAssignableFrom (TypeInfo typeInfo)
429 return base.IsAssignableFrom (typeInfo);