private static void ImplementCallMethodOnImplementation(TypeBuilder typeBuilder, MethodInfo method, FieldInfo lazyInitializerField) { /* * if (this.__lazyInitializer == null) * return base.<Method>(args..); * return this.__lazyInitializer.GetImplementation().<Method>(args..) */ var methodOverride = DefaultyProxyMethodBuilder.GenerateMethodSignature(method.Name, method, typeBuilder); var IL = methodOverride.GetILGenerator(); EmitCallBaseIfLazyInitializerIsNull(IL, method, lazyInitializerField); EmitCallImplementation(IL, method, lazyInitializerField); IL.Emit(OpCodes.Ret); typeBuilder.DefineMethodOverride(methodOverride, method); }
private static void ImplementCallMethodOnEmbeddedComponentId(TypeBuilder typeBuilder, MethodInfo method, FieldInfo lazyInitializerField) { /* * if (this.__lazyInitializer == null) * return base.<Method>(args..); * this.__lazyInitializer.Identifier.<Method>(args..); */ var methodOverride = DefaultyProxyMethodBuilder.GenerateMethodSignature(method.Name, method, typeBuilder); var IL = methodOverride.GetILGenerator(); EmitCallBaseIfLazyInitializerIsNull(IL, method, lazyInitializerField); IL.Emit(OpCodes.Ldarg_0); IL.Emit(OpCodes.Ldfld, lazyInitializerField); IL.Emit(OpCodes.Callvirt, LazyInitializerIdentifierProperty.GetMethod); IL.Emit(OpCodes.Unbox_Any, method.DeclaringType); EmitCallMethod(IL, OpCodes.Callvirt, method); IL.Emit(OpCodes.Ret); typeBuilder.DefineMethodOverride(methodOverride, method); }
private static void ImplementSetIdentifier(TypeBuilder typeBuilder, MethodInfo method, FieldInfo lazyInitializerField) { /* * set * { * if (this.__lazyInitializer == null) * return base.set_<Identifier>(value); * this.__lazyInitializer.Initialize(); * this.__lazyInitializer.Identifier = value; * this.__lazyInitializer.GetImplementation().<Identifier> = value; * } */ var propertyType = method.GetParameters()[0].ParameterType; var methodOverride = DefaultyProxyMethodBuilder.GenerateMethodSignature(method.Name, method, typeBuilder); var IL = methodOverride.GetILGenerator(); EmitCallBaseIfLazyInitializerIsNull(IL, method, lazyInitializerField); IL.Emit(OpCodes.Ldarg_0); IL.Emit(OpCodes.Ldfld, lazyInitializerField); IL.Emit(OpCodes.Callvirt, LazyInitializerInitializeMethod); IL.Emit(OpCodes.Ldarg_0); IL.Emit(OpCodes.Ldfld, lazyInitializerField); IL.Emit(OpCodes.Ldarg_1); if (propertyType.IsValueType) { IL.Emit(OpCodes.Box, propertyType); } IL.Emit(OpCodes.Callvirt, LazyInitializerIdentifierProperty.SetMethod); EmitCallImplementation(IL, method, lazyInitializerField); IL.Emit(OpCodes.Ret); typeBuilder.DefineMethodOverride(methodOverride, method); }
private static void ImplementGetIdentifier(TypeBuilder typeBuilder, MethodInfo method, FieldInfo lazyInitializerField) { /* * get * { * if (this.__lazyInitializer == null) * return base.get_<Identifier>(); * return (<ReturnType>)this.__lazyInitializer.Identifier; * } */ var methodOverride = DefaultyProxyMethodBuilder.GenerateMethodSignature(method.Name, method, typeBuilder); var IL = methodOverride.GetILGenerator(); EmitCallBaseIfLazyInitializerIsNull(IL, method, lazyInitializerField); IL.Emit(OpCodes.Ldarg_0); IL.Emit(OpCodes.Ldfld, lazyInitializerField); IL.Emit(OpCodes.Callvirt, LazyInitializerIdentifierProperty.GetMethod); IL.Emit(OpCodes.Unbox_Any, method.ReturnType); IL.Emit(OpCodes.Ret); typeBuilder.DefineMethodOverride(methodOverride, method); }