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);
        }
Exemple #3
0
 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);
 }
Exemple #4
0
        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;
 }
Exemple #8
0
        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);
        }