Exemple #1
0
        public static IEnumerable <T> MakeProxy <T>(this IEnumerable <T> enumerable, CollectionProxyKind kind)
        {
            Contract.Requires(enumerable != null);
            Contract.Ensures(Contract.Result <IEnumerable <T> >() != null);

            return(MakeProxy(enumerable, kind, null));
        }
Exemple #2
0
        public static IEnumerable MakeProxy(this IEnumerable enumerable,
                                            CollectionProxyKind kind, bool?readOnly)
        {
            Contract.Requires(enumerable != null);
            Contract.Ensures(Contract.Result <IEnumerable>() != null);

            switch (kind)
            {
            case CollectionProxyKind.Enumerable:
                return(new EnumerableProxy(enumerable));

            case CollectionProxyKind.Collection:
                if (true == readOnly)
                {
                    var message = "Cannot make a read-only proxy of an IEnumerable.";
                    throw new InvalidOperationException(message);
                }

                if (!(enumerable is ICollection))
                {
                    throw new ArgumentException("enumerable is not an ICollection.");
                }

                return(new CollectionProxy((ICollection)enumerable));

            case CollectionProxyKind.List:
                if (true == readOnly)
                {
                    var message = "Cannot make a read-only proxy of an IEnumerable.";
                    throw new InvalidOperationException(message);
                }

                if (!(enumerable is IList))
                {
                    throw new ArgumentException("enumerable is not an ICollection.");
                }

                return(new ListProxy((IList)enumerable));

            default:
                throw new ArgumentOutOfRangeException("kind");
            }
        }
Exemple #3
0
        public static IEnumerable <T> MakeProxy <T>(this IEnumerable <T> enumerable,
                                                    CollectionProxyKind kind, bool?readOnly)
        {
            Contract.Requires(enumerable != null);
            Contract.Ensures(Contract.Result <IEnumerable <T> >() != null);

            switch (kind)
            {
            case CollectionProxyKind.Enumerable:
                return(new EnumerableProxy <T>(enumerable));

            case CollectionProxyKind.Collection:
                // If not explicit readonly
                if (true != readOnly)
                {
                    // Try to create mutable collection proxy
                    if (enumerable is ICollection <T> )
                    {
                        return(new CollectionProxy <T>((ICollection <T>)enumerable));
                    }

                    // Handle error if explicit mutable
                    if (false == readOnly)
                    {
                        throw new ArgumentException(
                                  "Cannot create mutable proxy: enumerable is not ICollection<T>."
                                  );
                    }
                }

                // Try to create readonly collection proxy
                if (enumerable is IReadOnlyCollection <T> )
                {
                    return(new ReadOnlyCollectionProxy <T>((IReadOnlyCollection <T>)enumerable));
                }

                // Handle error if explicit readonly
                if (true == readOnly)
                {
                    throw new ArgumentException(
                              "Cannot create readonly proxy: enumerable is not IReadOnlyCollection<T>."
                              );
                }

                throw new ArgumentException("Cannot create collection proxy: " +
                                            "enumerable is neither an ICollection<T> nor an IReadOnlyCollection<T>.");

            case CollectionProxyKind.List:
                // If not explicit readonly
                if (true != readOnly)
                {
                    // Try to create mutable list proxy
                    if (enumerable is IList <T> )
                    {
                        return(new ListProxy <T>((IList <T>)enumerable));
                    }

                    // Handle error if explicit mutable
                    if (false == readOnly)
                    {
                        throw new ArgumentException(
                                  "Cannot create mutable proxy: enumerable is not IList<T>."
                                  );
                    }
                }

                // Try to create readonly list proxy
                if (enumerable is IReadOnlyList <T> )
                {
                    return(new ReadOnlyListProxy <T>((IReadOnlyList <T>)enumerable));
                }

                // Handle error if explicit readonly
                if (true == readOnly)
                {
                    throw new ArgumentException(
                              "Cannot create readonly proxy: enumerable is not IReadOnlyList<T>."
                              );
                }

                throw new ArgumentException("Cannot create list proxy: " +
                                            "enumerable is neither an IList<T> nor an IReadOnlyList<T>.");

            default:
                throw new ArgumentOutOfRangeException("kind");
            }
        }