// Creates an IEnumerable<TRuntimePropertyType> and populates it with the items in the,
        // sourceList argument then uses the delegateKey argument to identify the appropriate cached
        // CreateRange<TRuntimePropertyType> method to create and return the desired immutable collection type.
        public override IEnumerable CreateImmutableCollectionFromList(string delegateKey, IList sourceList)
        {
            Debug.Assert(DefaultImmutableConverter.CreateRangeDelegates.ContainsKey(delegateKey));

            DefaultImmutableConverter.ImmutableCreateRangeDelegate <TRuntimeProperty> createRangeDelegate = (
                (DefaultImmutableConverter.ImmutableCreateRangeDelegate <TRuntimeProperty>)DefaultImmutableConverter.CreateRangeDelegates[delegateKey]);

            return((IEnumerable)createRangeDelegate.Invoke(CreateGenericIEnumerableFromList(sourceList)));
        }
        // Creates an IEnumerable<TRuntimePropertyType> and populates it with the items in the
        // sourceList argument then uses the delegateKey argument to identify the appropriate cached
        // CreateRange<TRuntimePropertyType> method to create and return the desired immutable collection type.
        public override IEnumerable CreateImmutableCollectionFromList(Type collectionType, string delegateKey, IList sourceList, string propertyPath)
        {
            if (!DefaultImmutableConverter.TryGetCreateRangeDelegate(delegateKey, out object createRangeDelegateObj))
            {
                ThrowHelper.ThrowJsonException_DeserializeUnableToConvertValue(collectionType, propertyPath);
            }

            DefaultImmutableConverter.ImmutableCreateRangeDelegate <TRuntimeProperty> createRangeDelegate = (
                (DefaultImmutableConverter.ImmutableCreateRangeDelegate <TRuntimeProperty>)createRangeDelegateObj);

            return((IEnumerable)createRangeDelegate.Invoke(CreateGenericIEnumerableFromList(sourceList)));
        }