protected override void InitializeConstructors()
        {
            var parameters = InitializeConstructorParameters();

            var constructor = new ConstructorMetadata(parameters);

            Constructors.Add(constructor);
        }
        private static void DefineParameterNames(
            ConstructorBuilder constructor, 
            ConstructorMetadata constructorMetadata)
        {
            for (var i = 0; i < constructorMetadata.Parameters.Length; i++)
            {
                var parameter = constructorMetadata.Parameters[i];

                constructor.DefineParameter(parameter.Sequence, ParameterAttributes.None, parameter.Name);
            }
        }
        private static void GenerateBaseConstructorCall(ILGenerator il, ConstructorMetadata constructorMetadata)
        {
            il.Emit(OpCodes.Ldarg_0);

            for (var i = 0; i < constructorMetadata.Parameters.Length; i++)
            {
                var parameter = constructorMetadata.Parameters[i] as ConstructorBaseParameterMetadata;

                if (parameter != null)
                {
                    new LoadArgumentExpression(parameter.Sequence).Emit(il);
                }
            }

            il.Emit(OpCodes.Call, constructorMetadata.ConstructorInfo);
        }
 public TypeMetadata(
     string name,
     Type baseType,
     Type[] interfaces,
      DispatcherFieldMetadata dispatcherField,
     FieldMetadata[] fields,
     ConstructorMetadata[] constructors, 
     MethodMetadata[] methods, 
     PropertyMetadata[] properties, 
     EventMetadata[] events, 
     TargetMetadata[] targets)
 {
     _name = name;
     _baseType = baseType;
     _interfaces = interfaces;
     _dispatcherField = dispatcherField;
     _fields = fields;
     _constructors = constructors;
     _methods = methods;
     _properties = properties;
     _events = events;
     _targets = targets;
 }
        private static void GenerateConstructor(
            TypeBuilder typeBuilder, 
            TypeMetadata typeMetadata,
            ConstructorMetadata constructorMetadata,
            FieldMetadataFieldBuilderMap fieldBuilders)
        {
            var constructor = typeBuilder.DefineConstructor(
                constructorMetadata.MethodAttributes,
                CallingConventions.Standard,
                constructorMetadata.ParameterTypes);

            DefineParameterNames(constructor, constructorMetadata);

            var il = constructor.GetILGenerator();

            InitializeInstanceFields(il, typeMetadata, constructorMetadata, fieldBuilders);

            if (constructorMetadata.CallBaseConstructor)
            {
                GenerateBaseConstructorCall(il, constructorMetadata);
            }

            il.Emit(OpCodes.Ret);
        }
        protected virtual void InitializeDefaultConstructor()
        {
            var dispatcherParameter = new ConstructorDispatcherParameterMetadata(1, _dispatcherField);
            var parameters = new [] { dispatcherParameter };

            var constructor = new ConstructorMetadata(parameters);

            _constructors.Add(constructor);
        }
        private static void InitializeInstanceFields(
            ILGenerator il, 
            TypeMetadata typeMetadata,
            ConstructorMetadata constructorMetadata,
            FieldMetadataFieldBuilderMap fieldBuilders)
        {
            for (var i = 0; i < constructorMetadata.Parameters.Length; i++)
            {
                var parameter = constructorMetadata.Parameters[i];

                var dispatcherParameter = parameter as ConstructorDispatcherParameterMetadata;
                var targetParameter = parameter as ConstructorTargetParameterMetadata;

                if (dispatcherParameter != null)
                {
                    InitializeField(il, dispatcherParameter.InstanceField, dispatcherParameter, fieldBuilders);
                }
                else if(targetParameter != null)
                {
                    InitializeField(il, targetParameter.InstanceField, targetParameter, fieldBuilders);
                }
            }

            for (var i = 0; i < typeMetadata.Targets.Length; i++)
            {
                var target = typeMetadata.Targets[i];

                if (target.IsProxyInstantiated)
                {
                    InitializeTarget(il, target.InstanceField, target.TargetType, fieldBuilders);
                }
            }
        }