private void AddComplexPropertyAttribute(DynamicProperty property)
 {
     if (!_isPOCO)
     {
         property.HasAttribute(new EdmComplexPropertyAttribute());
     }
 }
Пример #2
0
        public DynamicProperty Property(string propertyName)
        {
            DynamicProperty property;

            if (!_properties.TryGetValue(propertyName, out property))
            {
                property = new DynamicProperty();
                property.PropertyName = propertyName;
                _properties.Add(propertyName, property);
            }
            return(property);
        }
        private void AddNavigationPropertyAttribute(XElement propertyDefinition, DynamicProperty property)
        {
            if (!_isPOCO)
            {
                string[] relationship = propertyDefinition.Attribute("Relationship").Value.Split('.');

                property.HasAttribute(
                    new EdmRelationshipNavigationPropertyAttribute(
                        relationship[0],
                        relationship[1],
                        (string)propertyDefinition.Attribute("ToRole")));
            }
        }
 private void AddScalarPropertyAttribute(XElement propertyDefinition, DynamicProperty property)
 {
     if (!_isPOCO)
     {
         property.HasAttribute(
             new EdmScalarPropertyAttribute()
         {
             IsNullable        = ((bool?)propertyDefinition.Attribute("Nullable") ?? false),
             EntityKeyProperty =
                 propertyDefinition.Parent.Descendants(_csdlNs + "PropertyRef")
                 .Any(
                     e =>
                     e.Parent.Name == _csdlNs + "Key" &&
                     (string)e.Attribute("Name") == property.PropertyName)
         });
     }
 }
Пример #5
0
        private void DefineProperty(TypeBuilder typeBuilder, DynamicProperty propertyInfo)
        {
            var getterAccess = propertyInfo.GetterAccess;
            var setterAccess = propertyInfo.SetterAccess;

            Type propertyType;

            if (propertyInfo.EnumType != null)
            {
                propertyType = _types[propertyInfo.EnumType.Item1.Name];

                if (propertyInfo.EnumType.Item2)
                {
                    propertyType = typeof(Nullable <>).MakeGenericType(propertyType);
                }
            }
            else if (propertyInfo.CollectionType != null)
            {
                if (propertyInfo.ReferenceType != null)
                {
                    propertyType =
                        propertyInfo.CollectionType.MakeGenericType(_typeBuilders[propertyInfo.ReferenceType.Name].Item1);
                }
                else
                {
                    propertyType = propertyInfo.CollectionType.MakeGenericType(propertyInfo.PropertyType);
                }
            }
            else if (propertyInfo.ReferenceType != null)
            {
                propertyType = _typeBuilders[propertyInfo.ReferenceType.Name].Item1;
                switch (_dynamicTypes[propertyInfo.ReferenceType.Name].TypeAccess)
                {
                case MemberAccess.Private:
                    getterAccess = MemberAccess.Private;
                    setterAccess = MemberAccess.Private;
                    break;

                case MemberAccess.Internal:
                    getterAccess = MemberAccess.Internal;
                    setterAccess = MemberAccess.Internal;
                    break;
                }
                if (propertyInfo.PropertyType != null &&
                    propertyInfo.PropertyType.IsGenericTypeDefinition())
                {
                    propertyType = propertyInfo.PropertyType.MakeGenericType(propertyType);
                }
            }
            else
            {
                propertyType = propertyInfo.PropertyType;
            }

            var fieldBuilder = typeBuilder.DefineField(
                "_" + propertyInfo.PropertyName, propertyType,
                FieldAttributes.Private);

            var propertyBuilder = typeBuilder.DefineProperty(
                propertyInfo.PropertyName,
                PropertyAttributes.None,
                propertyType, Type.EmptyTypes);

            foreach (var a in propertyInfo.Attributes)
            {
                propertyBuilder.SetCustomAttribute(AnnotationAttributeBuilder.Create(a));
            }

            if (propertyInfo.GetterAccess
                != MemberAccess.None)
            {
                var getter = typeBuilder.DefineMethod(
                    "get_" + propertyInfo.PropertyName,
                    GetMethodAttributes(propertyInfo.IsVirtual, getterAccess),
                    propertyType,
                    Type.EmptyTypes);
                var generator = getter.GetILGenerator();
                generator.Emit(OpCodes.Ldarg_0);
                generator.Emit(OpCodes.Ldfld, fieldBuilder);
                generator.Emit(OpCodes.Ret);
                propertyBuilder.SetGetMethod(getter);
            }

            if (propertyInfo.SetterAccess
                != MemberAccess.None)
            {
                var setter = typeBuilder.DefineMethod(
                    "set_" + propertyInfo.PropertyName,
                    GetMethodAttributes(propertyInfo.IsVirtual, setterAccess),
                    null,
                    new[] { propertyType });
                var generator = setter.GetILGenerator();
                generator.Emit(OpCodes.Ldarg_0);
                generator.Emit(OpCodes.Ldarg_1);
                generator.Emit(OpCodes.Stfld, fieldBuilder);
                generator.Emit(OpCodes.Ret);
                propertyBuilder.SetSetMethod(setter);
            }
        }