예제 #1
0
        /// <summary>
        /// Emits the IL for setting a backing component property
        /// </summary>
        /// <param name="setterIL">ILGenerator</param>
        /// <param name="sourceField">The field where the source component is stored</param>
        /// <param name="nestedType">Builder for a nested type, in case this property needs to
        /// make one</param>
        /// <param name="thisType">Builder for the current type</param>
        protected override void ProtectedEmitSetter(ILGenerator setterIL, FieldBuilder sourceField, Lazy <TypeSpecifier> nestedType, TypeSpecifier thisType, string name)
        {
            if (_invokeSetter == null)
            {
                setterIL.Emit(OpCodes.Ldarg_0);
                setterIL.Emit(OpCodes.Ldfld, sourceField);
                setterIL.Emit(OpCodes.Ldloc_0);
                setterIL.Emit(OpCodes.Callvirt, _componentProperty.GetSetMethod(true));
            }
            else
            {
                var nested        = nestedType.Value;
                var backingSetter = nested.TypeBuilder.DefineField(nested.GetBackingSetterIdentifier(name),
                                                                   _setterType,
                                                                   FieldAttributes.Public | FieldAttributes.Static);

                thisType.RunAfterCreation(() =>
                {
                    backingSetter.SafeSetValue(null, _invokeSetter);
                });

                setterIL.Emit(OpCodes.Ldsfld, backingSetter);
                setterIL.Emit(OpCodes.Ldarg_0);
                setterIL.Emit(OpCodes.Ldfld, sourceField);
                setterIL.Emit(OpCodes.Ldloc_0);
                setterIL.Emit(OpCodes.Callvirt, _setterType.GetMethod("Invoke"));
            }
        }
예제 #2
0
        /// <summary>
        /// Emits the IL for the setter
        /// </summary>
        /// <param name="setterIL">ILGenerator</param>
        /// <param name="sourceField">The field where the source component is stored</param>
        /// <param name="nestedType">Builder for nested type in case this property needs
        /// to make one</param>
        /// <param name="thisType">Builder for the declaring type</param>
        protected override void ProtectedEmitSetter(ILGenerator setterIL, FieldBuilder sourceField, Lazy <TypeSpecifier> nestedType, TypeSpecifier thisType, string name)
        {
            var backingSetter = nestedType.Value.TypeBuilder.DefineField(
                nestedType.Value.GetBackingSetterIdentifier(name),
                _setter.GetType(),
                FieldAttributes.Public | FieldAttributes.Static);

            thisType.RunAfterCreation(() =>
            {
                backingSetter.SafeSetValue(null, _setter);
            });

            setterIL.Emit(OpCodes.Ldsfld, backingSetter);
            setterIL.Emit(OpCodes.Ldarg_0);
            setterIL.Emit(OpCodes.Ldfld, sourceField);
            setterIL.Emit(OpCodes.Ldloc_0);
            setterIL.Emit(OpCodes.Callvirt, typeof(Action <TComponent, TValue>).GetMethod("Invoke"));
        }
        /// <summary>
        /// Emits the IL for this method
        /// </summary>
        /// <param name="il">IL Generator</param>
        /// <param name="sourceField">The field containing the source component</param>
        /// <param name="typeBeingBuilt">The type being built</param>
        internal override void Emit(ILGenerator il, FieldBuilder sourceField, TypeSpecifier typeBeingBuilt)
        {
            var nestedType   = typeBeingBuilt.CreateDisplayClass();
            var backingField = nestedType.TypeBuilder.DefineField(nestedType.GetInvokeName(_name),
                                                                  _invoke.GetType(),
                                                                  FieldAttributes.Static | FieldAttributes.Public);

            typeBeingBuilt.RunAfterCreation(() =>
            {
                backingField.SafeSetValue(null, _invoke);
            });

            il.Emit(OpCodes.Ldsfld, backingField);

            foreach (var p in _params)
            {
                p.Emit(il, sourceField, typeBeingBuilt.TypeBuilder);
            }

            il.Emit(OpCodes.Callvirt, _invoke.GetType().GetMethod("Invoke"));
            il.Emit(OpCodes.Ret);
        }