/// <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);
            }
Exemplo n.º 2
0
        /// <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()));
 }