The Labs \ Source Viewer \ SSCLI \ System.Reflection.Emit \ EnumBuilder

  1. // ==++==
  2. //
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. //
  14. // ==--==
  15. /*============================================================
  16. **
  17. ** Class:  EnumBuilder
  18. **
  19. **
  20. ** EnumBuilder is a helper class to build Enum ( a special type ).
  21. **
  22. **
  23. ===========================================================*/
  24. namespace System.Reflection.Emit
  25. {
  26.    
  27.     using System;
  28.     using System.Reflection;
  29.     using System.Runtime.Remoting.Activation;
  30.     using System.Runtime.InteropServices;
  31.     using CultureInfo = System.Globalization.CultureInfo;
  32.     using System.Security.Permissions;
  33.    
  34.    
  35.     [HostProtection(MayLeakOnAbort = true)]
  36.     [ClassInterface(ClassInterfaceType.None)]
  37.     [ComDefaultInterface(typeof(_EnumBuilder))]
  38.     [System.Runtime.InteropServices.ComVisible(true)]
  39.     public sealed class EnumBuilder : Type, _EnumBuilder
  40.     {
  41.        
  42.         // Define literal for enum
  43.        
  44.         public FieldBuilder DefineLiteral(string literalName, object literalValue)
  45.         {
  46.             BCLDebug.Log("DYNIL", "## DYNIL LOGGING: EnumBuilder.DefineLiteral( " + literalName + " )");
  47.            
  48.             // Define the underlying field for the enum. It will be a non-static, private field with special name bit set.
  49.             FieldBuilder fieldBuilder = m_typeBuilder.DefineField(literalName, this, FieldAttributes.Public | FieldAttributes.Static | FieldAttributes.Literal);
  50.             fieldBuilder.SetConstant(literalValue);
  51.             return fieldBuilder;
  52.         }
  53.        
  54.         // CreateType cause EnumBuilder to be baked.
  55.         public Type CreateType()
  56.         {
  57.             BCLDebug.Log("DYNIL", "## DYNIL LOGGING: EnumBuilder.CreateType() ");
  58.             return m_typeBuilder.CreateType();
  59.         }
  60.        
  61.         // Get the internal metadata token for this class.
  62.         public TypeToken TypeToken {
  63.             get { return m_typeBuilder.TypeToken; }
  64.         }
  65.        
  66.        
  67.         // return the underlying field for the enum
  68.         public FieldBuilder UnderlyingField {
  69.             get { return m_underlyingField; }
  70.         }
  71.        
  72.         public override string Name {
  73.             get { return m_typeBuilder.Name; }
  74.         }
  75.        
  76. /****************************************************
  77.         *
  78.         * abstract methods defined in the base class
  79.         *
  80.         */       
  81.         public override Guid GUID {
  82.             get { return m_typeBuilder.GUID; }
  83.         }
  84.        
  85.         public override object InvokeMember(string name, BindingFlags invokeAttr, Binder binder, object target, object[] args, ParameterModifier[] modifiers, CultureInfo culture, string[] namedParameters)
  86.         {
  87.             return m_typeBuilder.InvokeMember(name, invokeAttr, binder, target, args, modifiers, culture, namedParameters);
  88.         }
  89.        
  90.         public override Module Module {
  91.             get { return m_typeBuilder.Module; }
  92.         }
  93.        
  94.         public override Assembly Assembly {
  95.             get { return m_typeBuilder.Assembly; }
  96.         }
  97.        
  98.         public override RuntimeTypeHandle TypeHandle {
  99.             get { return m_typeBuilder.TypeHandle; }
  100.         }
  101.        
  102.         public override string FullName {
  103.             get { return m_typeBuilder.FullName; }
  104.         }
  105.        
  106.         public override string AssemblyQualifiedName {
  107.             get { return m_typeBuilder.AssemblyQualifiedName; }
  108.         }
  109.        
  110.         public override string Namespace {
  111.             get { return m_typeBuilder.Namespace; }
  112.         }
  113.        
  114.         public override Type BaseType {
  115.             get { return m_typeBuilder.BaseType; }
  116.         }
  117.        
  118.         protected override ConstructorInfo GetConstructorImpl(BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers)
  119.         {
  120.             return m_typeBuilder.GetConstructor(bindingAttr, binder, callConvention, types, modifiers);
  121.         }
  122.        
  123.         [System.Runtime.InteropServices.ComVisible(true)]
  124.         public override ConstructorInfo[] GetConstructors(BindingFlags bindingAttr)
  125.         {
  126.             return m_typeBuilder.GetConstructors(bindingAttr);
  127.         }
  128.        
  129.         protected override MethodInfo GetMethodImpl(string name, BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers)
  130.         {
  131.             if (types == null)
  132.                 return m_typeBuilder.GetMethod(name, bindingAttr);
  133.             else
  134.                 return m_typeBuilder.GetMethod(name, bindingAttr, binder, callConvention, types, modifiers);
  135.         }
  136.        
  137.         public override MethodInfo[] GetMethods(BindingFlags bindingAttr)
  138.         {
  139.             return m_typeBuilder.GetMethods(bindingAttr);
  140.         }
  141.        
  142.         public override FieldInfo GetField(string name, BindingFlags bindingAttr)
  143.         {
  144.             return m_typeBuilder.GetField(name, bindingAttr);
  145.         }
  146.        
  147.         public override FieldInfo[] GetFields(BindingFlags bindingAttr)
  148.         {
  149.             return m_typeBuilder.GetFields(bindingAttr);
  150.         }
  151.        
  152.         public override Type GetInterface(string name, bool ignoreCase)
  153.         {
  154.             return m_typeBuilder.GetInterface(name, ignoreCase);
  155.         }
  156.        
  157.         public override Type[] GetInterfaces()
  158.         {
  159.             return m_typeBuilder.GetInterfaces();
  160.         }
  161.        
  162.         public override EventInfo GetEvent(string name, BindingFlags bindingAttr)
  163.         {
  164.             return m_typeBuilder.GetEvent(name, bindingAttr);
  165.         }
  166.        
  167.         public override EventInfo[] GetEvents()
  168.         {
  169.             return m_typeBuilder.GetEvents();
  170.         }
  171.        
  172.         protected override PropertyInfo GetPropertyImpl(string name, BindingFlags bindingAttr, Binder binder, Type returnType, Type[] types, ParameterModifier[] modifiers)
  173.         {
  174.             throw new NotSupportedException(Environment.GetResourceString("NotSupported_DynamicModule"));
  175.         }
  176.        
  177.         public override PropertyInfo[] GetProperties(BindingFlags bindingAttr)
  178.         {
  179.             return m_typeBuilder.GetProperties(bindingAttr);
  180.         }
  181.        
  182.         public override Type[] GetNestedTypes(BindingFlags bindingAttr)
  183.         {
  184.             return m_typeBuilder.GetNestedTypes(bindingAttr);
  185.         }
  186.        
  187.         public override Type GetNestedType(string name, BindingFlags bindingAttr)
  188.         {
  189.             return m_typeBuilder.GetNestedType(name, bindingAttr);
  190.         }
  191.        
  192.         public override MemberInfo[] GetMember(string name, MemberTypes type, BindingFlags bindingAttr)
  193.         {
  194.             return m_typeBuilder.GetMember(name, type, bindingAttr);
  195.         }
  196.        
  197.         public override MemberInfo[] GetMembers(BindingFlags bindingAttr)
  198.         {
  199.             return m_typeBuilder.GetMembers(bindingAttr);
  200.         }
  201.        
  202.         [System.Runtime.InteropServices.ComVisible(true)]
  203.         public override InterfaceMapping GetInterfaceMap(Type interfaceType)
  204.         {
  205.             return m_typeBuilder.GetInterfaceMap(interfaceType);
  206.         }
  207.        
  208.         public override EventInfo[] GetEvents(BindingFlags bindingAttr)
  209.         {
  210.             return m_typeBuilder.GetEvents(bindingAttr);
  211.         }
  212.        
  213.         protected override TypeAttributes GetAttributeFlagsImpl()
  214.         {
  215.             return m_typeBuilder.m_iAttr;
  216.         }
  217.        
  218.         protected override bool IsArrayImpl()
  219.         {
  220.             return false;
  221.         }
  222.         protected override bool IsPrimitiveImpl()
  223.         {
  224.             return false;
  225.         }
  226.        
  227.         protected override bool IsValueTypeImpl()
  228.         {
  229.             return true;
  230.         }
  231.        
  232.         protected override bool IsByRefImpl()
  233.         {
  234.             return false;
  235.         }
  236.        
  237.         protected override bool IsPointerImpl()
  238.         {
  239.             return false;
  240.         }
  241.        
  242.         protected override bool IsCOMObjectImpl()
  243.         {
  244.             return false;
  245.         }
  246.        
  247.        
  248.         public override Type GetElementType()
  249.         {
  250.             return m_typeBuilder.GetElementType();
  251.         }
  252.        
  253.         protected override bool HasElementTypeImpl()
  254.         {
  255.             return m_typeBuilder.HasElementType;
  256.         }
  257.        
  258.         public override Type UnderlyingSystemType {
  259.             get { return m_underlyingType; }
  260.         }
  261.        
  262.         //ICustomAttributeProvider
  263.         public override object[] GetCustomAttributes(bool inherit)
  264.         {
  265.             return m_typeBuilder.GetCustomAttributes(inherit);
  266.         }
  267.        
  268.         // Return a custom attribute identified by Type
  269.         public override object[] GetCustomAttributes(Type attributeType, bool inherit)
  270.         {
  271.             return m_typeBuilder.GetCustomAttributes(attributeType, inherit);
  272.         }
  273.        
  274.         // Use this function if client decides to form the custom attribute blob themselves
  275.         [System.Runtime.InteropServices.ComVisible(true)]
  276.         public void SetCustomAttribute(ConstructorInfo con, byte[] binaryAttribute)
  277.         {
  278.             m_typeBuilder.SetCustomAttribute(con, binaryAttribute);
  279.         }
  280.        
  281.         // Use this function if client wishes to build CustomAttribute using CustomAttributeBuilder
  282.         public void SetCustomAttribute(CustomAttributeBuilder customBuilder)
  283.         {
  284.             m_typeBuilder.SetCustomAttribute(customBuilder);
  285.         }
  286.        
  287.         // Return the class that declared this Field.
  288.         public override Type DeclaringType {
  289.             get { return m_typeBuilder.DeclaringType; }
  290.         }
  291.        
  292.         // Return the class that was used to obtain this field.
  293.        
  294.         public override Type ReflectedType {
  295.             get { return m_typeBuilder.ReflectedType; }
  296.         }
  297.        
  298.        
  299.         // Returns true if one or more instance of attributeType is defined on this member.
  300.         public override bool IsDefined(Type attributeType, bool inherit)
  301.         {
  302.             return m_typeBuilder.IsDefined(attributeType, inherit);
  303.         }
  304.        
  305.        
  306.         internal override int MetadataTokenInternal {
  307.             get { return m_typeBuilder.MetadataTokenInternal; }
  308.         }
  309.        
  310. /*
  311.         public TypeToken TypeToken {
  312.             get { return m_typeBuilder.TypeToken; }
  313.         }
  314.         */       
  315.        
  316. /*****************************************************
  317.         *
  318.         * private/protected functions
  319.         *
  320.         */       
  321.        
  322.         //*******************************
  323.         // Make a private constructor so these cannot be constructed externally.
  324.         //*******************************
  325.         private EnumBuilder()
  326.         {
  327.         }
  328.        
  329.         public override Type MakePointerType()
  330.         {
  331.             return SymbolType.FormCompoundType("*".ToCharArray(), this, 0);
  332.         }
  333.        
  334.         public override Type MakeByRefType()
  335.         {
  336.             return SymbolType.FormCompoundType("&".ToCharArray(), this, 0);
  337.         }
  338.        
  339.         public override Type MakeArrayType()
  340.         {
  341.             return SymbolType.FormCompoundType("[]".ToCharArray(), this, 0);
  342.         }
  343.        
  344.         public override Type MakeArrayType(int rank)
  345.         {
  346.             if (rank <= 0)
  347.                 throw new IndexOutOfRangeException();
  348.            
  349.             string szrank = "";
  350.             if (rank == 1) {
  351.                 szrank = "*";
  352.             }
  353.             else {
  354.                 for (int i = 1; i < rank; i++)
  355.                     szrank += ",";
  356.             }
  357.            
  358.             string s = String.Format(CultureInfo.InvariantCulture, "[{0}]", szrank);
  359.             // [,,]
  360.             return SymbolType.FormCompoundType((s).ToCharArray(), this, 0);
  361.         }
  362.        
  363.        
  364.         // Constructs a EnumBuilder.
  365.             // name of type
  366.             // underlying type for an Enum
  367.             // any bits on TypeAttributes.VisibilityMask)
  368.         // module containing this type
  369.         internal EnumBuilder(string name, Type underlyingType, TypeAttributes visibility, Module module)
  370.         {
  371.             // Client should not set any bits other than the visibility bits.
  372.             if ((visibility & ~TypeAttributes.VisibilityMask) != 0)
  373.                 throw new ArgumentException(Environment.GetResourceString("Argument_ShouldOnlySetVisibilityFlags"), "name");
  374.             m_typeBuilder = new TypeBuilder(name, visibility | TypeAttributes.Sealed, typeof(System.Enum), null, module, PackingSize.Unspecified, null);
  375.             m_underlyingType = underlyingType;
  376.            
  377.             // Define the underlying field for the enum. It will be a non-static, private field with special name bit set.
  378.            
  379.            
  380.             m_underlyingField = m_typeBuilder.DefineField("value__", underlyingType, FieldAttributes.Private | FieldAttributes.SpecialName);
  381.         }
  382.        
  383.         void _EnumBuilder.GetTypeInfoCount(out uint pcTInfo)
  384.         {
  385.             throw new NotImplementedException();
  386.         }
  387.        
  388.         void _EnumBuilder.GetTypeInfo(uint iTInfo, uint lcid, IntPtr ppTInfo)
  389.         {
  390.             throw new NotImplementedException();
  391.         }
  392.        
  393.         void _EnumBuilder.GetIDsOfNames(        [In()]
  394. ref Guid riid, IntPtr rgszNames, uint cNames, uint lcid, IntPtr rgDispId)
  395.         {
  396.             throw new NotImplementedException();
  397.         }
  398.        
  399.         void _EnumBuilder.Invoke(uint dispIdMember,         [In()]
  400. ref Guid riid, uint lcid, short wFlags, IntPtr pDispParams, IntPtr pVarResult, IntPtr pExcepInfo, IntPtr puArgErr)
  401.         {
  402.             throw new NotImplementedException();
  403.         }
  404.        
  405.        
  406. /*****************************************************
  407.         *
  408.         * private data members
  409.         *
  410.         */       
  411.         private Type m_underlyingType;
  412.         internal TypeBuilder m_typeBuilder;
  413.         private FieldBuilder m_underlyingField;
  414.         internal Type m_runtimeType = null;
  415.     }
  416. }

Developer Fusion