public bool EmitMember( TypeBuilder typeBuilder, EdmMember member, PropertyBuilder propertyBuilder, PropertyInfo baseProperty, BaseProxyImplementor baseImplementor) { if (_scalarMembers.Contains(member)) { var isKeyMember = _ospaceEntityType.KeyMembers.Contains(member.Identity); EmitScalarSetter(typeBuilder, propertyBuilder, baseProperty, isKeyMember); return(true); } else if (_relationshipMembers.Contains(member)) { Debug.Assert(member != null, "member is null"); Debug.Assert(member.BuiltInTypeKind == BuiltInTypeKind.NavigationProperty); var navProperty = member as NavigationProperty; if (navProperty.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many) { EmitCollectionProperty(typeBuilder, propertyBuilder, baseProperty, navProperty); } else { EmitReferenceProperty(typeBuilder, propertyBuilder, baseProperty, navProperty); } baseImplementor.AddBasePropertySetter(baseProperty); return(true); } return(false); }
public bool EmitMember( TypeBuilder typeBuilder, EdmMember member, PropertyBuilder propertyBuilder, PropertyInfo baseProperty, BaseProxyImplementor baseImplementor) { if (this._scalarMembers.Contains(member)) { bool isKeyMember = this._ospaceEntityType.KeyMembers.Contains(member.Identity); this.EmitScalarSetter(typeBuilder, propertyBuilder, baseProperty, isKeyMember); return(true); } if (!this._relationshipMembers.Contains(member)) { return(false); } NavigationProperty navProperty = member as NavigationProperty; if (navProperty.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many) { this.EmitCollectionProperty(typeBuilder, propertyBuilder, baseProperty, navProperty); } else { this.EmitReferenceProperty(typeBuilder, propertyBuilder, baseProperty, navProperty); } baseImplementor.AddBasePropertySetter(baseProperty); return(true); }
public ProxyTypeBuilder(ClrEntityType ospaceEntityType) { _ospaceEntityType = ospaceEntityType; _baseImplementor = new BaseProxyImplementor(); _ipocoImplementor = new IPocoImplementor(ospaceEntityType); _lazyLoadImplementor = new LazyLoadImplementor(ospaceEntityType); _dataContractImplementor = new DataContractImplementor(ospaceEntityType); _iserializableImplementor = new SerializableImplementor(ospaceEntityType); }
public bool EmitMember( TypeBuilder typeBuilder, EdmMember member, PropertyBuilder propertyBuilder, PropertyInfo baseProperty, BaseProxyImplementor baseImplementor) { if (!this._members.Contains(member)) { return(false); } MethodInfo meth = baseProperty.Getter(); MethodAttributes methodAttributes = meth.Attributes & MethodAttributes.MemberAccessMask; Type type = typeof(Func <, ,>).MakeGenericType((Type)typeBuilder, baseProperty.PropertyType, typeof(bool)); MethodInfo method = TypeBuilder.GetMethod(type, typeof(Func <, ,>).GetOnlyDeclaredMethod("Invoke")); FieldBuilder fieldBuilder = typeBuilder.DefineField(LazyLoadImplementor.GetInterceptorFieldName(baseProperty.Name), type, FieldAttributes.Private | FieldAttributes.Static); MethodBuilder mdBuilder = typeBuilder.DefineMethod("get_" + baseProperty.Name, methodAttributes | MethodAttributes.Virtual | MethodAttributes.HideBySig | MethodAttributes.SpecialName, baseProperty.PropertyType, Type.EmptyTypes); ILGenerator ilGenerator = mdBuilder.GetILGenerator(); Label label = ilGenerator.DefineLabel(); ilGenerator.DeclareLocal(baseProperty.PropertyType); ilGenerator.Emit(OpCodes.Ldarg_0); ilGenerator.Emit(OpCodes.Call, meth); ilGenerator.Emit(OpCodes.Stloc_0); ilGenerator.Emit(OpCodes.Ldarg_0); ilGenerator.Emit(OpCodes.Ldfld, (FieldInfo)fieldBuilder); ilGenerator.Emit(OpCodes.Ldarg_0); ilGenerator.Emit(OpCodes.Ldloc_0); ilGenerator.Emit(OpCodes.Callvirt, method); ilGenerator.Emit(OpCodes.Brtrue_S, label); ilGenerator.Emit(OpCodes.Ldarg_0); ilGenerator.Emit(OpCodes.Call, meth); ilGenerator.Emit(OpCodes.Ret); ilGenerator.MarkLabel(label); ilGenerator.Emit(OpCodes.Ldloc_0); ilGenerator.Emit(OpCodes.Ret); propertyBuilder.SetGetMethod(mdBuilder); baseImplementor.AddBasePropertyGetter(baseProperty); return(true); }
public bool EmitMember( TypeBuilder typeBuilder, EdmMember member, PropertyBuilder propertyBuilder, PropertyInfo baseProperty, BaseProxyImplementor baseImplementor) { if (_members.Contains(member)) { var baseGetter = baseProperty.GetGetMethod(true); const MethodAttributes getterAttributes = MethodAttributes.HideBySig | MethodAttributes.SpecialName | MethodAttributes.Virtual; var getterAccess = baseGetter.Attributes & MethodAttributes.MemberAccessMask; // Define field to store interceptor Func // Signature of interceptor Func delegate is as follows: // // bool intercept(ProxyType proxy, PropertyType propertyValue) // // where // PropertyType is the type of the Property, such as ICollection<Customer>, // ProxyType is the type of the proxy object, // propertyValue is the value returned from the proxied type's property getter. var interceptorType = typeof(Func<,,>).MakeGenericType(typeBuilder, baseProperty.PropertyType, typeof(bool)); var interceptorInvoke = TypeBuilder.GetMethod(interceptorType, typeof(Func<,,>).GetMethod("Invoke")); var interceptorField = typeBuilder.DefineField( GetInterceptorFieldName(baseProperty.Name), interceptorType, FieldAttributes.Private | FieldAttributes.Static); // Define a property getter override in the proxy type var getterBuilder = typeBuilder.DefineMethod( "get_" + baseProperty.Name, getterAccess | getterAttributes, baseProperty.PropertyType, Type.EmptyTypes); var generator = getterBuilder.GetILGenerator(); // Emit instructions for the following call: // T value = base.SomeProperty; // if(this._interceptorForSomeProperty(this, value)) // { return value; } // return base.SomeProperty; // where _interceptorForSomeProperty represents the interceptor Func field. var lableTrue = generator.DefineLabel(); generator.DeclareLocal(baseProperty.PropertyType); // T value generator.Emit(OpCodes.Ldarg_0); // call base.SomeProperty generator.Emit(OpCodes.Call, baseGetter); // call to base property getter generator.Emit(OpCodes.Stloc_0); // value = result generator.Emit(OpCodes.Ldarg_0); // load this generator.Emit(OpCodes.Ldfld, interceptorField); // load this._interceptor generator.Emit(OpCodes.Ldarg_0); // load this generator.Emit(OpCodes.Ldloc_0); // load value generator.Emit(OpCodes.Callvirt, interceptorInvoke); // call to interceptor delegate with (this, value) generator.Emit(OpCodes.Brtrue_S, lableTrue); // if true, just return generator.Emit(OpCodes.Ldarg_0); // else, call the base propertty getter again generator.Emit(OpCodes.Call, baseGetter); // call to base property getter generator.Emit(OpCodes.Ret); generator.MarkLabel(lableTrue); generator.Emit(OpCodes.Ldloc_0); generator.Emit(OpCodes.Ret); propertyBuilder.SetGetMethod(getterBuilder); baseImplementor.AddBasePropertyGetter(baseProperty); return true; } return false; }
public ProxyTypeBuilder(ClrEntityType ospaceEntityType) { _ospaceEntityType = ospaceEntityType; _baseImplementor = new BaseProxyImplementor(); _ipocoImplementor = new IPOCOImplementor(ospaceEntityType); _lazyLoadImplementor = new LazyLoadImplementor(ospaceEntityType); _dataContractImplementor = new DataContractImplementor(ospaceEntityType); _iserializableImplementor = new SerializableImplementor(ospaceEntityType); }
public bool EmitMember( TypeBuilder typeBuilder, EdmMember member, PropertyBuilder propertyBuilder, PropertyInfo baseProperty, BaseProxyImplementor baseImplementor) { if (_scalarMembers.Contains(member)) { var isKeyMember = _ospaceEntityType.KeyMembers.Contains(member.Identity); EmitScalarSetter(typeBuilder, propertyBuilder, baseProperty, isKeyMember); return true; } else if (_relationshipMembers.Contains(member)) { Debug.Assert(member != null, "member is null"); Debug.Assert(member.BuiltInTypeKind == BuiltInTypeKind.NavigationProperty); var navProperty = member as NavigationProperty; if (navProperty.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many) { EmitCollectionProperty(typeBuilder, propertyBuilder, baseProperty, navProperty); } else { EmitReferenceProperty(typeBuilder, propertyBuilder, baseProperty, navProperty); } baseImplementor.AddBasePropertySetter(baseProperty); return true; } return false; }
public bool EmitMember( TypeBuilder typeBuilder, EdmMember member, PropertyBuilder propertyBuilder, PropertyInfo baseProperty, BaseProxyImplementor baseImplementor) { if (_members.Contains(member)) { var baseGetter = baseProperty.Getter(); const MethodAttributes getterAttributes = MethodAttributes.HideBySig | MethodAttributes.SpecialName | MethodAttributes.Virtual; var getterAccess = baseGetter.Attributes & MethodAttributes.MemberAccessMask; // Define field to store interceptor Func // Signature of interceptor Func delegate is as follows: // // bool intercept(ProxyType proxy, PropertyType propertyValue) // // where // PropertyType is the type of the Property, such as ICollection<Customer>, // ProxyType is the type of the proxy object, // propertyValue is the value returned from the proxied type's property getter. var interceptorType = typeof(Func <, ,>).MakeGenericType(typeBuilder, baseProperty.PropertyType, typeof(bool)); var interceptorInvoke = TypeBuilder.GetMethod(interceptorType, typeof(Func <, ,>).GetOnlyDeclaredMethod("Invoke")); var interceptorField = typeBuilder.DefineField( GetInterceptorFieldName(baseProperty.Name), interceptorType, FieldAttributes.Private | FieldAttributes.Static); // Define a property getter override in the proxy type var getterBuilder = typeBuilder.DefineMethod( "get_" + baseProperty.Name, getterAccess | getterAttributes, baseProperty.PropertyType, Type.EmptyTypes); var generator = getterBuilder.GetILGenerator(); // Emit instructions for the following call: // T value = base.SomeProperty; // if(this._interceptorForSomeProperty(this, value)) // { return value; } // return base.SomeProperty; // where _interceptorForSomeProperty represents the interceptor Func field. var lableTrue = generator.DefineLabel(); generator.DeclareLocal(baseProperty.PropertyType); // T value generator.Emit(OpCodes.Ldarg_0); // call base.SomeProperty generator.Emit(OpCodes.Call, baseGetter); // call to base property getter generator.Emit(OpCodes.Stloc_0); // value = result generator.Emit(OpCodes.Ldarg_0); // load this generator.Emit(OpCodes.Ldfld, interceptorField); // load this._interceptor generator.Emit(OpCodes.Ldarg_0); // load this generator.Emit(OpCodes.Ldloc_0); // load value generator.Emit(OpCodes.Callvirt, interceptorInvoke); // call to interceptor delegate with (this, value) generator.Emit(OpCodes.Brtrue_S, lableTrue); // if true, just return generator.Emit(OpCodes.Ldarg_0); // else, call the base propertty getter again generator.Emit(OpCodes.Call, baseGetter); // call to base property getter generator.Emit(OpCodes.Ret); generator.MarkLabel(lableTrue); generator.Emit(OpCodes.Ldloc_0); generator.Emit(OpCodes.Ret); propertyBuilder.SetGetMethod(getterBuilder); baseImplementor.AddBasePropertyGetter(baseProperty); return(true); } return(false); }