/// <summary>
        /// Generates one public constructor receiving
        /// the <see cref="IInterceptor"/> instance and instantiating a hashtable
        /// </summary>
        protected virtual EasyConstructor GenerateConstructor(ConstructorInfo baseConstructor)
        {
            ArrayList arguments = new ArrayList();

            ArgumentReference arg1 = new ArgumentReference(Context.Interceptor);
            ArgumentReference arg2 = new ArgumentReference(typeof(object[]));

            arguments.Add(arg1);

            ParameterInfo[] parameters = baseConstructor.GetParameters();

            if (Context.HasMixins)
            {
                arguments.Add(arg2);
            }

            ArgumentReference[] originalArguments =
                ArgumentsUtil.ConvertToArgumentReference(parameters);

            arguments.AddRange(originalArguments);

            EasyConstructor constructor = MainTypeBuilder.CreateConstructor(
                (ArgumentReference[])arguments.ToArray(typeof(ArgumentReference)));

            GenerateConstructorCode(constructor.CodeBuilder, arg1, SelfReference.Self, arg2);

            constructor.CodeBuilder.InvokeBaseConstructor(baseConstructor, originalArguments);

            constructor.CodeBuilder.AddStatement(new ReturnStatement());

            return(constructor);
        }
        /// <summary>
        /// Generates one public constructor receiving
        /// the <see cref="IInterceptor"/> instance and instantiating a HybridCollection
        /// </summary>
        protected override EasyConstructor GenerateConstructor()
        {
            ArgumentReference arg1 = new ArgumentReference(Context.Interceptor);
            ArgumentReference arg2 = new ArgumentReference(typeof(object));
            ArgumentReference arg3 = new ArgumentReference(typeof(object[]));

            EasyConstructor constructor;

            if (Context.HasMixins)
            {
                constructor = MainTypeBuilder.CreateConstructor(arg1, arg2, arg3);
            }
            else
            {
                constructor = MainTypeBuilder.CreateConstructor(arg1, arg2);
            }

            GenerateConstructorCode(constructor.CodeBuilder, arg1, SelfReference.Self, arg3);

            constructor.CodeBuilder.InvokeBaseConstructor();

            constructor.CodeBuilder.AddStatement(new AssignStatement(
                                                     _targetField, arg2.ToExpression()));

            constructor.CodeBuilder.AddStatement(new ReturnStatement());

            return(constructor);
        }
        protected void GenerateSerializationConstructor()
        {
            ArgumentReference arg1 = new ArgumentReference(typeof(SerializationInfo));
            ArgumentReference arg2 = new ArgumentReference(typeof(StreamingContext));

            EasyConstructor constr = MainTypeBuilder.CreateConstructor(arg1, arg2);

            constr.CodeBuilder.AddStatement(new ExpressionStatement(
                                                new ConstructorInvocationExpression(_serializationConstructor,
                                                                                    arg1.ToExpression(), arg2.ToExpression())));

            Type[]     object_arg     = new Type[] { typeof(String), typeof(Type) };
            MethodInfo getValueMethod = typeof(SerializationInfo).GetMethod("GetValue", object_arg);

            VirtualMethodInvocationExpression getInterceptorInvocation =
                new VirtualMethodInvocationExpression(arg1, getValueMethod,
                                                      new FixedReference("__interceptor").ToExpression(),
                                                      new TypeTokenExpression(Context.Interceptor));

            VirtualMethodInvocationExpression getMixinsInvocation =
                new VirtualMethodInvocationExpression(arg1, getValueMethod,
                                                      new FixedReference("__mixins").ToExpression(),
                                                      new TypeTokenExpression(typeof(object[])));

            constr.CodeBuilder.AddStatement(new AssignStatement(
                                                InterceptorField, getInterceptorInvocation));

            constr.CodeBuilder.AddStatement(new AssignStatement(
                                                CacheField, new NewInstanceExpression(
                                                    typeof(HybridDictionary).GetConstructor(new Type[0]))));

            constr.CodeBuilder.AddStatement(new AssignStatement(
                                                MixinField,
                                                getMixinsInvocation));

            // Initialize the delegate fields
            foreach (CallableField field in _cachedFields)
            {
                field.WriteInitialization(constr.CodeBuilder, SelfReference.Self, MixinField);
            }

            constr.CodeBuilder.AddStatement(new ReturnStatement());
        }