public AccessOptimizer(GetPropertyValuesInvoker getDelegate,
                        SetPropertyValuesInvoker setDelegate,
                        GetPropertyValueInvoker[] getters,
                        SetPropertyValueInvoker[] setters,
                        GetPropertyValueInvoker specializedGetter,
                        SetPropertyValueInvoker specializedSetter)
 {
     this.getDelegate   = getDelegate;
     this.setDelegate   = setDelegate;
     _getters           = getters;
     _setters           = setters;
     _specializedGetter = specializedGetter;
     _specializedSetter = specializedSetter;
     getterCallback     = GetPropertyValue;
     setterCallback     = SetPropertyValue;
 }
        /// <summary>
        /// Class constructor.
        /// </summary>
        public ReflectionOptimizer(
            System.Type mappedType, IGetter[] getters, ISetter[] setters,
            IGetter specializedGetter, ISetter specializedSetter)
        {
            // save off references
            this.mappedType = mappedType;
            typeOfThis      = mappedType.IsValueType ? mappedType.MakeByRefType() : mappedType;
            //this.getters = getters;
            //this.setters = setters;

            GetPropertyValuesInvoker getInvoker = GenerateGetPropertyValuesMethod(getters);
            SetPropertyValuesInvoker setInvoker = GenerateSetPropertyValuesMethod(setters);

            var getMethods = new GetPropertyValueInvoker[getters.Length];

            for (var i = 0; i < getters.Length; i++)
            {
                getMethods[i] = GenerateGetPropertyValueMethod(getters[i]);
            }

            var setMethods = new SetPropertyValueInvoker[setters.Length];

            for (var i = 0; i < setters.Length; i++)
            {
                setMethods[i] = GenerateSetPropertyValueMethod(setters[i]);
            }

            accessOptimizer = new AccessOptimizer(
                getInvoker,
                setInvoker,
                getMethods,
                setMethods,
                GenerateGetPropertyValueMethod(specializedGetter),
                GenerateSetPropertyValueMethod(specializedSetter)
                );

            createInstanceMethod = CreateCreateInstanceMethod(mappedType);
        }