コード例 #1
0
        /// <summary>
        /// Generate IL for the getter.
        /// </summary>
        /// <param name="stubField">The proxy stub field.</param>
        /// <param name="dbKey">The database key of this property.</param>
        /// <param name="propMetadata">The type metadata for this property.</param>
        /// <param name="ilGenerator">The getter's IL generator.</param>
        /// <param name="readOnly">True if the proxy from the getter is readonly.</param>
        private static void GenerateGetterIL(
            FieldInfo stubField,
            string dbKey,
            TypeMetadata propMetadata,
            ILGenerator ilGenerator,
            bool readOnly)
        {
            // this._stub.
            ilGenerator.Emit(OpCodes.Ldarg_0);
            ilGenerator.Emit(OpCodes.Ldfld, stubField);
            ilGenerator.Emit(OpCodes.Ldstr, dbKey);

            // this._stub.?Getter(dbKey).
            propMetadata.CallStubGetter(ilGenerator, readOnly);

            // return ?;
            ilGenerator.Emit(OpCodes.Ret);
        }
コード例 #2
0
        /// <summary>
        /// Generate IL for GetElemAt method.
        /// </summary>
        /// <param name="elemTypeMetadata">The element type metadata.</param>
        /// <param name="ilGenerator">The method's IL generator.</param>
        /// <param name="readOnly">True if the property is readonly.</param>
        private static void GenerateGetElemAtIL(
            TypeMetadata elemTypeMetadata,
            ILGenerator ilGenerator,
            bool readOnly)
        {
            // this._stub.
            ilGenerator.Emit(OpCodes.Ldarg_0);
            ilGenerator.Emit(OpCodes.Ldfld, typeof(ListProxy <>).MakeGenericType(elemTypeMetadata.Type).GetField("stub", BindingFlags.NonPublic | BindingFlags.Instance));

            // this.ElemPrefix(index).
            ilGenerator.Emit(OpCodes.Ldarg_0);
            ilGenerator.Emit(OpCodes.Ldarg_1);
            ilGenerator.Emit(OpCodes.Call, typeof(ListProxy <>).MakeGenericType(elemTypeMetadata.Type).GetMethod("GetElemDbKey", BindingFlags.NonPublic | BindingFlags.Instance));

            // this._stub.?Getter(elemPrefix).
            elemTypeMetadata.CallStubGetter(ilGenerator, readOnly);

            // return ?;
            ilGenerator.Emit(OpCodes.Ret);
        }