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 ();
74 internal override Type RuntimeResolve () {
75 return _tb.RuntimeResolve ();
78 public override Assembly Assembly {
84 public override string AssemblyQualifiedName {
86 return _tb.AssemblyQualifiedName;
90 public override Type BaseType {
96 public override Type DeclaringType {
98 return _tb.DeclaringType;
102 public override string FullName {
108 public override Guid GUID {
114 public override Module Module {
120 public override string Name {
126 public override string Namespace {
128 return _tb.Namespace;
132 public override Type ReflectedType {
134 return _tb.ReflectedType;
138 public override RuntimeTypeHandle TypeHandle {
140 return _tb.TypeHandle;
144 public TypeToken TypeToken {
146 return _tb.TypeToken;
150 public FieldBuilder UnderlyingField {
152 return _underlyingField;
156 public override Type UnderlyingSystemType {
158 return _underlyingType;
162 public Type CreateType ()
164 Type res = _tb.CreateType ();
168 public TypeInfo CreateTypeInfo()
170 return _tb.CreateTypeInfo ();
173 public override Type GetEnumUnderlyingType ()
175 return _underlyingType;
178 [MethodImplAttribute(MethodImplOptions.InternalCall)]
179 private extern void setup_enum_type (Type t);
181 public FieldBuilder DefineLiteral (string literalName, object literalValue)
183 Type fieldType = this;
184 FieldBuilder fieldBuilder = _tb.DefineField (literalName,
185 fieldType, (FieldAttributes.Literal |
186 (FieldAttributes.Static | FieldAttributes.Public)));
187 fieldBuilder.SetConstant (literalValue);
191 protected override TypeAttributes GetAttributeFlagsImpl ()
196 protected override ConstructorInfo GetConstructorImpl (
197 BindingFlags bindingAttr, Binder binder, CallingConventions callConvention,
198 Type[] types, ParameterModifier[] modifiers)
200 return _tb.GetConstructor (bindingAttr, binder, callConvention, types,
205 public override ConstructorInfo[] GetConstructors(BindingFlags bindingAttr)
207 return _tb.GetConstructors (bindingAttr);
210 public override object[] GetCustomAttributes(bool inherit)
212 return _tb.GetCustomAttributes (inherit);
215 public override object[] GetCustomAttributes(Type attributeType, bool inherit)
217 return _tb.GetCustomAttributes (attributeType, inherit);
220 public override Type GetElementType()
222 return _tb.GetElementType ();
225 public override EventInfo GetEvent( string name, BindingFlags bindingAttr)
227 return _tb.GetEvent (name, bindingAttr);
230 public override EventInfo[] GetEvents()
232 return _tb.GetEvents ();
235 public override EventInfo[] GetEvents( BindingFlags bindingAttr)
237 return _tb.GetEvents (bindingAttr);
240 public override FieldInfo GetField( string name, BindingFlags bindingAttr)
242 return _tb.GetField (name, bindingAttr);
245 public override FieldInfo[] GetFields( BindingFlags bindingAttr)
247 return _tb.GetFields (bindingAttr);
250 public override Type GetInterface (string name, bool ignoreCase)
252 return _tb.GetInterface (name, ignoreCase);
256 public override InterfaceMapping GetInterfaceMap (Type interfaceType)
258 return _tb.GetInterfaceMap (interfaceType);
261 public override Type[] GetInterfaces()
263 return _tb.GetInterfaces ();
266 public override MemberInfo[] GetMember (string name, MemberTypes type, BindingFlags bindingAttr)
268 return _tb.GetMember (name, type, bindingAttr);
271 public override MemberInfo[] GetMembers(BindingFlags bindingAttr)
273 return _tb.GetMembers (bindingAttr);
276 protected override MethodInfo GetMethodImpl (
277 string name, BindingFlags bindingAttr, Binder binder,
278 CallingConventions callConvention, Type[] types,
279 ParameterModifier[] modifiers)
282 return _tb.GetMethod (name, bindingAttr);
285 return _tb.GetMethod (name, bindingAttr, binder,
286 callConvention, types, modifiers);
289 public override MethodInfo[] GetMethods (BindingFlags bindingAttr)
291 return _tb.GetMethods (bindingAttr);
294 public override Type GetNestedType (string name, BindingFlags bindingAttr)
296 return _tb.GetNestedType (name, bindingAttr);
299 public override Type[] GetNestedTypes (BindingFlags bindingAttr)
301 return _tb.GetNestedTypes (bindingAttr);
304 public override PropertyInfo[] GetProperties (BindingFlags bindingAttr)
306 return _tb.GetProperties (bindingAttr);
309 protected override PropertyInfo GetPropertyImpl (
310 string name, BindingFlags bindingAttr, Binder binder,
311 Type returnType, Type[] types,
312 ParameterModifier[] modifiers)
314 throw CreateNotSupportedException ();
317 protected override bool HasElementTypeImpl ()
319 return _tb.HasElementType;
322 public override object InvokeMember (
323 string name, BindingFlags invokeAttr, Binder binder,
324 object target, object[] args,
325 ParameterModifier[] modifiers, CultureInfo culture,
326 string[] namedParameters)
328 return _tb.InvokeMember (name, invokeAttr, binder, target,
329 args, modifiers, culture, namedParameters);
332 protected override bool IsArrayImpl()
337 protected override bool IsByRefImpl()
342 protected override bool IsCOMObjectImpl()
347 protected override bool IsPointerImpl()
352 protected override bool IsPrimitiveImpl()
357 protected override bool IsValueTypeImpl()
362 public override bool IsDefined (Type attributeType, bool inherit)
364 return _tb.IsDefined (attributeType, inherit);
367 public override Type MakeArrayType ()
369 return new ArrayType (this, 0);
372 public override Type MakeArrayType (int rank)
375 throw new IndexOutOfRangeException ();
376 return new ArrayType (this, rank);
379 public override Type MakeByRefType ()
381 return new ByRefType (this);
384 public override Type MakePointerType ()
386 return new PointerType (this);
389 public void SetCustomAttribute (CustomAttributeBuilder customBuilder)
391 _tb.SetCustomAttribute (customBuilder);
395 public void SetCustomAttribute (ConstructorInfo con, byte[] binaryAttribute)
397 SetCustomAttribute (new CustomAttributeBuilder (con, binaryAttribute));
400 private Exception CreateNotSupportedException ()
402 return new NotSupportedException ("The invoked member is not supported in a dynamic module.");
405 void _EnumBuilder.GetIDsOfNames ([In] ref Guid riid, IntPtr rgszNames, uint cNames, uint lcid, IntPtr rgDispId)
407 throw new NotImplementedException ();
410 void _EnumBuilder.GetTypeInfo (uint iTInfo, uint lcid, IntPtr ppTInfo)
412 throw new NotImplementedException ();
415 void _EnumBuilder.GetTypeInfoCount (out uint pcTInfo)
417 throw new NotImplementedException ();
420 void _EnumBuilder.Invoke (uint dispIdMember, [In] ref Guid riid, uint lcid, short wFlags, IntPtr pDispParams, IntPtr pVarResult, IntPtr pExcepInfo, IntPtr puArgErr)
422 throw new NotImplementedException ();
425 internal override bool IsUserType {
431 public override bool IsConstructedGenericType {
432 get { return false; }
435 public override bool IsAssignableFrom (TypeInfo typeInfo)
437 return base.IsAssignableFrom (typeInfo);