示例#1
0
        /// <summary>
        /// 定义属性的 Set 访问方法。
        /// </summary>
        /// <param name="visual">指定方法的可见性。</param>
        /// <param name="calling">指定方法的调用属性。</param>
        /// <param name="fieldBuilder">指定一个属性相关的 <see cref="DynamicFieldBuilder"/>。</param>
        /// <returns>新的 <see cref="DynamicMethodBuilder"/>。</returns>
        public DynamicMethodBuilder DefineSetMethodByField(VisualDecoration visual = VisualDecoration.Public, CallingDecoration calling = CallingDecoration.Standard, DynamicFieldBuilder fieldBuilder = null)
        {
            var isInterface = Context.TypeBuilder is DynamicInterfaceBuilder;
            var method      = new DynamicMethodBuilder(Context, string.Concat("set_", GetMethodName()), null, new[] { PropertyType }, visual, calling, ctx =>
            {
                if (isInterface)
                {
                    return;
                }

                if (fieldBuilder == null)
                {
                    fieldBuilder = FieldBuilder;
                }

                ctx.Emitter.ldarg_0.ldarg_1.stfld(fieldBuilder.FieldBuilder).ret();
            });

            PropertyBuilder.SetSetMethod(method.MethodBuilder);
            return(method);
        }
        /// <summary>
        /// 定义属性的 Get 访问方法。
        /// </summary>
        /// <param name="visual">指定方法的可见性。</param>
        /// <param name="calling">指定方法的调用属性。</param>
        /// <param name="fieldBuilder">指定一个属性相关的 <see cref="DynamicFieldBuilder"/>。</param>
        /// <returns>新的 <see cref="DynamicMethodBuilder"/>。</returns>
        public DynamicMethodBuilder DefineGetMethodByField(VisualDecoration visual = VisualDecoration.Public, CallingDecoration calling = CallingDecoration.Standard, DynamicFieldBuilder fieldBuilder = null)
        {
            var isInterface = Context.TypeBuilder is DynamicInterfaceBuilder;
            var method      = new DynamicMethodBuilder(Context, "get_" + Name, PropertyType, Type.EmptyTypes, ilCoding: ctx =>
            {
                if (isInterface)
                {
                    return;
                }

                if (fieldBuilder == null)
                {
                    fieldBuilder = FieldBuilder;
                }

                ctx.Emitter.ldarg_0.ldfld(fieldBuilder.FieldBuilder).ret();
            });

            PropertyBuilder.SetGetMethod(method.MethodBuilder);
            return(method);
        }
示例#3
0
        /// <summary>
        /// 定义属性的 Get 访问方法。
        /// </summary>
        /// <param name="visual">指定方法的可见性。</param>
        /// <param name="calling">指定方法的调用属性。</param>
        /// <param name="ilCoding">方法体的 IL 过程。</param>
        /// <returns>新的 <see cref="DynamicMethodBuilder"/>。</returns>
        public DynamicMethodBuilder DefineGetMethod(VisualDecoration visual = VisualDecoration.Public, CallingDecoration calling = CallingDecoration.Standard, Action <BuildContext> ilCoding = null)
        {
            var isInterface = Context.TypeBuilder is DynamicInterfaceBuilder;
            var method      = new DynamicMethodBuilder(Context, string.Concat("get_", GetMethodName()), PropertyType, Type.EmptyTypes, visual, calling, ctx =>
            {
                if (isInterface)
                {
                    return;
                }

                if (ilCoding != null)
                {
                    ilCoding(ctx);
                }
                else
                {
                    ctx.Emitter.ldarg_0.ldfld(FieldBuilder.FieldBuilder).ret();
                }
            });

            PropertyBuilder.SetGetMethod(method.MethodBuilder);
            return(method);
        }
        /// <summary>
        /// 定义属性的 Set 访问方法。
        /// </summary>
        /// <param name="visual">指定方法的可见性。</param>
        /// <param name="calling">指定方法的调用属性。</param>
        /// <param name="ilCoding">方法体的 IL 过程。</param>
        /// <returns>新的 <see cref="DynamicMethodBuilder"/>。</returns>
        public DynamicMethodBuilder DefineSetMethod(VisualDecoration visual = VisualDecoration.Public, CallingDecoration calling = CallingDecoration.Standard, Action <BuildContext> ilCoding = null)
        {
            var isInterface = Context.TypeBuilder is DynamicInterfaceBuilder;
            var method      = new DynamicMethodBuilder(Context, "set_" + Name, null, new[] { PropertyType }, ilCoding: ctx =>
            {
                if (isInterface)
                {
                    return;
                }

                if (ilCoding != null)
                {
                    ilCoding(ctx);
                }
                else
                {
                    ctx.Emitter.ldarg_0.ldarg_1.stfld(FieldBuilder.FieldBuilder).ret();
                }
            });

            PropertyBuilder.SetSetMethod(method.MethodBuilder);
            return(method);
        }