/// <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); }
/// <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); }