/// <summary> /// Gets the property info annotation for the specified resource type or creates a new one if it doesn't exist. /// </summary> /// <param name="resourceType">The resource type to get the annotation for.</param> /// <returns>The property info annotation.</returns> internal static PropertyInfoResourceTypeAnnotation GetPropertyInfoResourceTypeAnnotation(ResourceType resourceType) { DebugUtils.CheckNoExternalCallers(); Debug.Assert(resourceType != null, "resourceType != null"); PropertyInfoResourceTypeAnnotation propertyInfoResourceTypeAnnotation = resourceType.GetAnnotation<PropertyInfoResourceTypeAnnotation>(); if (propertyInfoResourceTypeAnnotation == null) { propertyInfoResourceTypeAnnotation = new PropertyInfoResourceTypeAnnotation(); resourceType.SetAnnotation(propertyInfoResourceTypeAnnotation); } return propertyInfoResourceTypeAnnotation; }
/// <summary>Helper method to add a reference property.</summary> /// <param name="resourceType">The resource type to add the property to.</param> /// <param name="name">The name of the property to add.</param> /// <param name="targetResourceSet">The resource set the resource reference property points to.</param> /// <param name="resourceSetReference">true if the property should be a resource set reference, false if it should be resource reference.</param> private void AddReferenceProperty(ResourceType resourceType, string name, ResourceSet targetResourceSet, bool resourceSetReference) { ResourceProperty property = new ResourceProperty( name, resourceSetReference ? ResourcePropertyKind.ResourceSetReference : ResourcePropertyKind.ResourceReference, targetResourceSet.ResourceType); property.CanReflectOnInstanceTypeProperty = false; resourceType.AddProperty(property); // We don't support type inheritance so the property can only point to the base resource type of the target resource set // We also don't support MEST, that is having two resource sets with the same resource type, so we can determine // the resource set from the resource type. That also means that the property can never point to different resource sets // so we can precreate the ResourceAssociationSet for this property right here as we have all the information. property.CustomState = new ResourcePropertyAnnotation() { ResourceAssociationSet = new ResourceAssociationSet( resourceType.Name + "_" + name + "_" + targetResourceSet.Name, new ResourceAssociationSetEnd(resourceType.GetAnnotation().ResourceSet, resourceType, property), new ResourceAssociationSetEnd(targetResourceSet, targetResourceSet.ResourceType, null)) }; }
/// <summary>Adds a resource set to the metadata definition.</summary> /// <param name="name">The name of the resource set to add.</param> /// <param name="entityType">The type of entities in the resource set.</param> /// <returns>The newly created resource set.</returns> public ResourceSet AddResourceSet(string name, ResourceType entityType) { if (entityType.ResourceTypeKind != ResourceTypeKind.EntityType) { throw new ArgumentException("The resource type specified as the base type of a resource set is not an entity type."); } ResourceSet resourceSet = new ResourceSet(name, entityType); entityType.GetAnnotation().ResourceSet = resourceSet; this.resourceSets.Add(name, resourceSet); return resourceSet; }