internal StateManagerTypeMetadata(EdmType edmType, ObjectTypeMapping mapping) { this._typeUsage = TypeUsage.Create(edmType); this._recordInfo = new DataRecordInfo(this._typeUsage); ReadOnlyMetadataCollection <EdmProperty> properties = TypeHelpers.GetProperties(edmType); this._members = new StateManagerMemberMetadata[properties.Count]; this._objectNameToOrdinal = new Dictionary <string, int>(properties.Count); this._cLayerNameToOrdinal = new Dictionary <string, int>(properties.Count); ReadOnlyMetadataCollection <EdmMember> metadataCollection = (ReadOnlyMetadataCollection <EdmMember>)null; if (Helper.IsEntityType(edmType)) { metadataCollection = ((EntityTypeBase)edmType).KeyMembers; } for (int index = 0; index < this._members.Length; ++index) { EdmProperty memberMetadata = properties[index]; ObjectPropertyMapping memberMap = (ObjectPropertyMapping)null; if (mapping != null) { memberMap = mapping.GetPropertyMap(memberMetadata.Name); if (memberMap != null) { this._objectNameToOrdinal.Add(memberMap.ClrProperty.Name, index); } } this._cLayerNameToOrdinal.Add(memberMetadata.Name, index); this._members[index] = new StateManagerMemberMetadata(memberMap, memberMetadata, metadataCollection != null && metadataCollection.Contains((EdmMember)memberMetadata)); } }
internal StateManagerMemberMetadata(ObjectPropertyMapping memberMap, EdmProperty memberMetadata, bool isPartOfKey) { DebugCheck.NotNull(memberMap); DebugCheck.NotNull(memberMetadata); _clrProperty = memberMap.ClrProperty; _edmProperty = memberMetadata; _isPartOfKey = isPartOfKey; _isComplexType = (Helper.IsEntityType(_edmProperty.TypeUsage.EdmType) || Helper.IsComplexType(_edmProperty.TypeUsage.EdmType)); }
internal StateManagerMemberMetadata( ObjectPropertyMapping memberMap, EdmProperty memberMetadata, bool isPartOfKey) { this._clrProperty = memberMap.ClrProperty; this._edmProperty = memberMetadata; this._isPartOfKey = isPartOfKey; this._isComplexType = Helper.IsEntityType(this._edmProperty.TypeUsage.EdmType) || Helper.IsComplexType(this._edmProperty.TypeUsage.EdmType); }
internal StateManagerMemberMetadata(ObjectPropertyMapping memberMap, EdmProperty memberMetadata, bool isPartOfKey) { // if memberMap is null, then this is a shadowstate Debug.Assert(null != memberMap, "shadowstate not supported"); Debug.Assert(null != memberMetadata, "CSpace should never be null"); _clrProperty = memberMap.ClrProperty; _edmProperty = memberMetadata; _isPartOfKey = isPartOfKey; _isComplexType = (Helper.IsEntityType(_edmProperty.TypeUsage.EdmType) || Helper.IsComplexType(_edmProperty.TypeUsage.EdmType)); }
private static void SetProperty <T>( ref T newO, ObjectPropertyMapping indexerVal, object tempValue, CustomMappingFunction customMappingFunction) { if (customMappingFunction != null) { var customVal = customMappingFunction.Action.Invoke(tempValue); indexerVal.ObjectPropertyInfo.SetValue(newO, customVal); } else { if (indexerVal.ObjectType == typeof(Guid)) { indexerVal.ObjectPropertyInfo.SetValue(newO, new Guid(tempValue.ToString()), null); } else if (indexerVal.ObjectPropertyInfo.PropertyType.IsEnum) { indexerVal.ObjectPropertyInfo.SetValue( newO, Enum.Parse(indexerVal.ObjectPropertyInfo.PropertyType, tempValue.ToString()), null); } else if (indexerVal.ObjectType == typeof(bool)) { if (tempValue == "0" || tempValue == "1") { indexerVal.ObjectPropertyInfo.SetValue( newO, Convert.ChangeType(int.Parse(tempValue.ToString()), indexerVal.ObjectType), null); } else { indexerVal.ObjectPropertyInfo.SetValue( newO, Convert.ChangeType(tempValue, indexerVal.ObjectType), null); } } else { indexerVal.ObjectPropertyInfo.SetValue( newO, Convert.ChangeType(tempValue, indexerVal.ObjectType), null); } } }
internal StateManagerTypeMetadata(EdmType edmType, ObjectTypeMapping mapping) { DebugCheck.NotNull(edmType); Debug.Assert( Helper.IsEntityType(edmType) || Helper.IsComplexType(edmType), "not Complex or EntityType"); Debug.Assert( ReferenceEquals(mapping, null) || ReferenceEquals(mapping.EdmType, edmType), "different EdmType instance"); _typeUsage = TypeUsage.Create(edmType); _recordInfo = new DataRecordInfo(_typeUsage); var members = TypeHelpers.GetProperties(edmType); _members = new StateManagerMemberMetadata[members.Count]; _objectNameToOrdinal = new Dictionary <string, int>(members.Count); _cLayerNameToOrdinal = new Dictionary <string, int>(members.Count); ReadOnlyMetadataCollection <EdmMember> keyMembers = null; if (Helper.IsEntityType(edmType)) { keyMembers = ((EntityType)edmType).KeyMembers; } for (var i = 0; i < _members.Length; ++i) { var member = members[i]; ObjectPropertyMapping memberMap = null; if (null != mapping) { memberMap = mapping.GetPropertyMap(member.Name); if (null != memberMap) { _objectNameToOrdinal.Add(memberMap.ClrProperty.Name, i); // olayer name } } _cLayerNameToOrdinal.Add(member.Name, i); // clayer name // Determine whether this member is part of the identity of the entity. _members[i] = new StateManagerMemberMetadata(memberMap, member, ((null != keyMembers) && keyMembers.Contains(member))); } }
public static void GenerateProperties(Type objectType, ExecutionContext context) { var timer = new Stopwatch(); timer.Start(); try { if (ObjectMappings.ContainsKey(objectType)) { return; } ObjectMappings.TryAdd(objectType, new ConcurrentDictionary <string, ObjectPropertyMapping>()); // Need to look at attributes on properties for type conversions foreach (var pi in objectType.GetProperties()) { if (pi.PropertyType.IsEnum) { var wimp = new ObjectPropertyMapping { Name = pi.Name, IsEnum = true, ObjectType = pi.PropertyType, ObjectPropertyInfo = pi, IsNullable = true }; ObjectMappings[objectType].TryAdd(pi.Name.ToLower(), wimp); } else if (pi.PropertyType.IsGenericType && pi.PropertyType.GetGenericTypeDefinition() == typeof(Nullable <>)) { var underlyingType = Nullable.GetUnderlyingType(pi.PropertyType); var objectPropertyMapping = new ObjectPropertyMapping { // ReSharper disable once PossibleNullReferenceException Name = pi.Name, ObjectType = underlyingType, ObjectPropertyInfo = pi, IsNullable = true }; ObjectMappings[objectType].TryAdd(pi.Name.ToLower(), objectPropertyMapping); } else if (pi.PropertyType.IsValueType || pi.PropertyType.Name == "String" || pi.PropertyType.Name == "Byte[]") { var objectPropertyMapping = new ObjectPropertyMapping { Name = pi.Name, ObjectType = pi.PropertyType, ObjectPropertyInfo = pi }; ObjectMappings[objectType].TryAdd(pi.Name.ToLower(), objectPropertyMapping); } } } finally { timer.Stop(); context.ExecutionEvent.GeneratePropertiesTiming = timer.ElapsedTicks; } }