/// <summary> /// Gets all the types in the types's hierarchy. This includes both the base types, the derived types, and the starting type. /// </summary> /// <param name="startingType">The starting type.</param> /// <returns>The types derived from or base of the starting type.</returns> public IEnumerable <ResourceType> GetAllTypesInHierarchy(ResourceType startingType) { var types = startingType.BaseTypesAndSelf(); // TODO: should we be caching these calls? if (this.provider.HasDerivedTypes(startingType)) { types = types.Concat(this.provider.GetDerivedTypes(startingType)); } return(types); }
/// <summary> /// Gets the set of operations selected for types the instance type can be assigned to that are bindable to the instance type. /// </summary> /// <param name="instanceTypeBeingSerialized">The instance type being serialized.</param> /// <returns>The selected bindable operations.</returns> private List <OperationWrapper> GetSelectedAndBindableOperationsForAssignableTypes(ResourceType instanceTypeBeingSerialized) { IEnumerable <OperationWrapper> selectedOperations = Enumerable.Empty <OperationWrapper>(); // Gather up all the selected operations that were selected for types that this instance type is assignable from. foreach (var baseType in instanceTypeBeingSerialized.BaseTypesAndSelf()) { List <OperationWrapper> selectedOperationsForUriType; if (this.selectedOperationsByUriType.TryGetValue(baseType, out selectedOperationsForUriType)) { selectedOperations = selectedOperations.Concat(selectedOperationsForUriType); } } // Only return the operations that are actually bindable to the instance type. // this filtering is needed because the key for something like Person will include actions bound to Employee and Manager as well, // so that something like ?$select=ActionName will match a varying set of actions based on which instance type is being serialized. selectedOperations = selectedOperations.Where(o => o.BindingParameter.ParameterType.IsAssignableFrom(instanceTypeBeingSerialized)); // Ensure the set is distinct before caching it. selectedOperations = selectedOperations.Distinct(); return(selectedOperations.ToList()); }
/// <summary> /// Gets a collection of actions having <paramref name="bindingParameterType"/> or any of it's base types as the binding parameter type. /// </summary> /// <param name="bindingParameterType">Instance of the binding parameter resource type (<see cref="ResourceType"/>) in question.</param> /// <returns>A list of actions having <paramref name="bindingParameterType"/> as the binding parameter type.</returns> internal List <OperationWrapper> GetServiceActionsByBindingParameterType(ResourceType bindingParameterType) { Debug.Assert(bindingParameterType != null, "bindingParameterType != null"); Debug.Assert(bindingParameterType.ResourceTypeKind == ResourceTypeKind.EntityType, "Only entity types should be passed to this method."); return(this.GetServiceActionsBySpecificBindingParameterTypes(bindingParameterType.BaseTypesAndSelf())); }