private void AddComplexPropertyAttribute(DynamicProperty property) { if (!_isPOCO) { property.HasAttribute(new EdmComplexPropertyAttribute()); } }
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) }); } }
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); } }