예제 #1
0
        private CollectionContractTypeMap RegisterCollectionContract(Type type)
        {
            var cdca = GetAttribute <CollectionDataContractAttribute> (type);

            if (cdca == null)
            {
                return(null);
            }

            Type element = GetCollectionElementType(type);

            if (element == null)
            {
                throw new InvalidOperationException(String.Format("Type '{0}' is marked as collection contract, but it is not a collection", type));
            }

            TryRegister(element);              // must be registered before the name conflict check.

            QName qname = GetCollectionContractQName(type);

            CheckStandardQName(qname);
            if (FindUserMap(qname) != null)
            {
                throw new InvalidOperationException(String.Format("Failed to add type {0} to known type collection. There already is a registered type for XML name {1}", type, qname));
            }

            var ret = new CollectionContractTypeMap(type, cdca, element, qname, this);

            contracts.Add(ret);
            return(ret);
        }
예제 #2
0
        private CollectionContractTypeMap RegisterCollectionContract(Type type)
        {
            var cdca = GetAttribute <CollectionDataContractAttribute> (type);

            if (cdca == null)
            {
                return(null);
            }

            Type element = GetCollectionElementType(type);

            if (element == null)
            {
                throw new InvalidDataContractException(String.Format("Type '{0}' is marked as collection contract, but it is not a collection", type));
            }
            if (type.GetMethod("Add", new Type[] { element }) == null)
            {
                throw new InvalidDataContractException(String.Format("Type '{0}' is marked as collection contract, but missing a public \"Add\" method", type));
            }

            TryRegister(element);              // must be registered before the name conflict check.

            QName qname = GetCollectionContractQName(type);

            CheckStandardQName(qname);
            var map = FindUserMap(qname, type);

            if (map != null)
            {
                var cmap = map as CollectionContractTypeMap;
                if (cmap == null)                 // The runtime type may still differ (between array and other IList; see bug #670560)
                {
                    throw new InvalidOperationException(String.Format("Failed to add type {0} to known type collection. There already is a registered type for XML name {1}", type, qname));
                }
            }

            var ret = new CollectionContractTypeMap(type, cdca, element, qname, this);

            contracts.Add(ret);
            return(ret);
        }