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); }
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); }