internal void Add(GenericInfo actualParamInfo) { if (this.paramGenericInfos == null) { this.paramGenericInfos = new List <GenericInfo>(); } this.paramGenericInfos.Add(actualParamInfo); }
internal void Add(GenericInfo actualParamInfo) { if (this.paramGenericInfos == null) { this.paramGenericInfos = new List<GenericInfo>(); } this.paramGenericInfos.Add(actualParamInfo); }
CodeTypeReference GetReferencedGenericType(GenericInfo genInfo, out DataContract dataContract) { dataContract = null; if (!SupportsGenericTypeReference) return null; Type type; if (!TryGetReferencedType(genInfo.StableName, null, out type)) { if (genInfo.Parameters != null) return null; dataContract = dataContractSet[genInfo.StableName]; if (dataContract == null) return null; if (dataContract.GenericInfo != null) return null; return GetCodeTypeReference(dataContract); } bool enableStructureCheck = (type != Globals.TypeOfNullable); CodeTypeReference typeReference = GetCodeTypeReference(type); typeReference.UserData.Add(codeUserDataActualTypeKey, type); if (genInfo.Parameters != null) { DataContract[] paramContracts = new DataContract[genInfo.Parameters.Count]; for (int i = 0; i < genInfo.Parameters.Count; i++) { GenericInfo paramInfo = genInfo.Parameters[i]; XmlQualifiedName stableName = paramInfo.GetExpandedStableName(); DataContract paramContract = dataContractSet[stableName]; CodeTypeReference paramTypeReference; bool isParamValueType; if (paramContract != null) { paramTypeReference = GetCodeTypeReference(paramContract); isParamValueType = paramContract.IsValueType; } else { paramTypeReference = GetReferencedGenericType(paramInfo, out paramContract); isParamValueType = (paramTypeReference != null && paramTypeReference.ArrayRank == 0); // only value type information we can get from CodeTypeReference } paramContracts[i] = paramContract; if (paramContract == null) enableStructureCheck = false; if (paramTypeReference == null) return null; if (type == Globals.TypeOfNullable && !isParamValueType) return paramTypeReference; else typeReference.TypeArguments.Add(paramTypeReference); } if (enableStructureCheck) dataContract = DataContract.GetDataContract(type).BindGenericParameters(paramContracts, new Dictionary<DataContract, DataContract>()); } return typeReference; }
private CodeTypeReference GetReferencedGenericType(GenericInfo genInfo, out DataContract dataContract) { Type type; dataContract = null; if (!this.SupportsGenericTypeReference) { return null; } if (!this.TryGetReferencedType(genInfo.StableName, null, out type)) { if (genInfo.Parameters != null) { return null; } dataContract = this.dataContractSet[genInfo.StableName]; if (dataContract == null) { return null; } if (dataContract.GenericInfo != null) { return null; } return this.GetCodeTypeReference(dataContract); } bool flag = type != Globals.TypeOfNullable; CodeTypeReference codeTypeReference = this.GetCodeTypeReference(type); codeTypeReference.UserData.Add(codeUserDataActualTypeKey, type); if (genInfo.Parameters != null) { DataContract[] paramContracts = new DataContract[genInfo.Parameters.Count]; for (int i = 0; i < genInfo.Parameters.Count; i++) { CodeTypeReference referencedGenericType; bool isValueType; GenericInfo info = genInfo.Parameters[i]; XmlQualifiedName expandedStableName = info.GetExpandedStableName(); DataContract contract = this.dataContractSet[expandedStableName]; if (contract != null) { referencedGenericType = this.GetCodeTypeReference(contract); isValueType = contract.IsValueType; } else { referencedGenericType = this.GetReferencedGenericType(info, out contract); isValueType = (referencedGenericType != null) && (referencedGenericType.ArrayRank == 0); } paramContracts[i] = contract; if (contract == null) { flag = false; } if (referencedGenericType == null) { return null; } if ((type == Globals.TypeOfNullable) && !isValueType) { return referencedGenericType; } codeTypeReference.TypeArguments.Add(referencedGenericType); } if (flag) { dataContract = DataContract.GetDataContract(type).BindGenericParameters(paramContracts, new Dictionary<DataContract, DataContract>()); } } return codeTypeReference; }
GenericInfo ImportGenericInfo(XmlElement typeElement, XmlSchemaType type) { XmlNode nameAttribute = typeElement.Attributes.GetNamedItem(Globals.GenericNameAttribute); string name = (nameAttribute == null) ? null : nameAttribute.Value; if (name == null) throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.GetString(SR.GenericAnnotationAttributeNotFound, type.Name, Globals.GenericNameAttribute))); XmlNode nsAttribute = typeElement.Attributes.GetNamedItem(Globals.GenericNamespaceAttribute); string ns = (nsAttribute == null) ? null : nsAttribute.Value; if (ns == null) throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.GetString(SR.GenericAnnotationAttributeNotFound, type.Name, Globals.GenericNamespaceAttribute))); if (typeElement.ChildNodes.Count > 0) //Generic Type name = DataContract.EncodeLocalName(name); int currentLevel = 0; GenericInfo genInfo = new GenericInfo(new XmlQualifiedName(name, ns), type.Name); foreach (XmlNode childNode in typeElement.ChildNodes) { XmlElement argumentElement = childNode as XmlElement; if (argumentElement == null) continue; if (argumentElement.LocalName != Globals.GenericParameterLocalName || argumentElement.NamespaceURI != Globals.SerializationNamespace) throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.GetString(SR.GenericAnnotationHasInvalidElement, argumentElement.LocalName, argumentElement.NamespaceURI, type.Name))); XmlNode nestedLevelAttribute = argumentElement.Attributes.GetNamedItem(Globals.GenericParameterNestedLevelAttribute); int argumentLevel = 0; if (nestedLevelAttribute != null) { if (!Int32.TryParse(nestedLevelAttribute.Value, out argumentLevel)) throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.GetString(SR.GenericAnnotationHasInvalidAttributeValue, argumentElement.LocalName, argumentElement.NamespaceURI, type.Name, nestedLevelAttribute.Value, nestedLevelAttribute.LocalName, Globals.TypeOfInt.Name))); } if (argumentLevel < currentLevel) throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.GetString(SR.GenericAnnotationForNestedLevelMustBeIncreasing, argumentElement.LocalName, argumentElement.NamespaceURI, type.Name))); genInfo.Add(ImportGenericInfo(argumentElement, type)); genInfo.AddToLevel(argumentLevel, 1); currentLevel = argumentLevel; } XmlNode typeNestedLevelsAttribute = typeElement.Attributes.GetNamedItem(Globals.GenericParameterNestedLevelAttribute); if (typeNestedLevelsAttribute != null) { int nestedLevels = 0; if (!Int32.TryParse(typeNestedLevelsAttribute.Value, out nestedLevels)) throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.GetString(SR.GenericAnnotationHasInvalidAttributeValue, typeElement.LocalName, typeElement.NamespaceURI, type.Name, typeNestedLevelsAttribute.Value, typeNestedLevelsAttribute.LocalName, Globals.TypeOfInt.Name))); if ((nestedLevels - 1) > currentLevel) genInfo.AddToLevel(nestedLevels - 1, 0); } return genInfo; }
GenericInfo GetGenericInfoForDataMember(DataMember dataMember) { GenericInfo genericInfo = null; if (dataMember.MemberTypeContract.IsValueType && dataMember.IsNullable) { genericInfo = new GenericInfo(DataContract.GetStableName(Globals.TypeOfNullable), Globals.TypeOfNullable.FullName); genericInfo.Add(new GenericInfo(dataMember.MemberTypeContract.StableName, null)); } else { genericInfo = new GenericInfo(dataMember.MemberTypeContract.StableName, null); } return genericInfo; }
CollectionDataContract ImportCollection(XmlQualifiedName typeName, XmlSchemaSequence rootSequence, XmlSchemaObjectCollection attributes, XmlSchemaAnnotation annotation, bool isReference) { CollectionDataContract dataContract = new CollectionDataContract(CollectionKind.Array); dataContract.StableName = typeName; AddDataContract(dataContract); dataContract.IsReference = isReference; // CheckIfCollection has already checked if sequence contains exactly one item with maxOccurs="unbounded" or maxOccurs > 1 XmlSchemaElement element = (XmlSchemaElement)rootSequence.Items[0]; dataContract.IsItemTypeNullable = element.IsNillable; dataContract.ItemName = element.Name; XmlSchemaForm elementForm = (element.Form == XmlSchemaForm.None) ? SchemaHelper.GetSchemaWithType(SchemaObjects, schemaSet, typeName).ElementFormDefault : element.Form; if (elementForm != XmlSchemaForm.Qualified) ThrowArrayTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.ArrayItemFormMustBe, element.Name)); CheckIfElementUsesUnsupportedConstructs(typeName, element); if (element.SchemaTypeName.IsEmpty) { if (element.SchemaType != null) { XmlQualifiedName shortName = new XmlQualifiedName(element.Name, typeName.Namespace); DataContract contract = dataContractSet[shortName]; if (contract == null) { dataContract.ItemContract = ImportAnonymousElement(element, shortName); } else { XmlQualifiedName fullName = new XmlQualifiedName(String.Format(CultureInfo.InvariantCulture, "{0}.{1}Type", typeName.Name, element.Name), typeName.Namespace); dataContract.ItemContract = ImportAnonymousElement(element, fullName); } } else if (!element.RefName.IsEmpty) ThrowArrayTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.ElementRefOnLocalElementNotSupported, element.RefName.Name, element.RefName.Namespace)); else dataContract.ItemContract = ImportType(SchemaExporter.AnytypeQualifiedName); } else { dataContract.ItemContract = ImportType(element.SchemaTypeName); } if (IsDictionary(typeName, annotation)) { ClassDataContract keyValueContract = dataContract.ItemContract as ClassDataContract; DataMember key = null, value = null; if (keyValueContract == null || keyValueContract.Members == null || keyValueContract.Members.Count != 2 || !(key = keyValueContract.Members[0]).IsRequired || !(value = keyValueContract.Members[1]).IsRequired) { ThrowArrayTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.InvalidKeyValueType, element.Name)); } if (keyValueContract.Namespace != dataContract.Namespace) { ThrowArrayTypeCannotBeImportedException(typeName.Name, typeName.Namespace, SR.GetString(SR.InvalidKeyValueTypeNamespace, element.Name, keyValueContract.Namespace)); } keyValueContract.IsValueType = true; dataContract.KeyName = key.Name; dataContract.ValueName = value.Name; if (element.SchemaType != null) { dataContractSet.Remove(keyValueContract.StableName); GenericInfo genericInfo = new GenericInfo(DataContract.GetStableName(Globals.TypeOfKeyValue), Globals.TypeOfKeyValue.FullName); genericInfo.Add(GetGenericInfoForDataMember(key)); genericInfo.Add(GetGenericInfoForDataMember(value)); genericInfo.AddToLevel(0, 2); dataContract.ItemContract.StableName = new XmlQualifiedName(genericInfo.GetExpandedStableName().Name, typeName.Namespace); } } return dataContract; }
private GenericInfo ImportGenericInfo(XmlElement typeElement, XmlSchemaType type) { System.Xml.XmlNode namedItem = typeElement.Attributes.GetNamedItem("Name"); string localName = (namedItem == null) ? null : namedItem.Value; if (localName == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(System.Runtime.Serialization.SR.GetString("GenericAnnotationAttributeNotFound", new object[] { type.Name, "Name" }))); } System.Xml.XmlNode node2 = typeElement.Attributes.GetNamedItem("Namespace"); string ns = (node2 == null) ? null : node2.Value; if (ns == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(System.Runtime.Serialization.SR.GetString("GenericAnnotationAttributeNotFound", new object[] { type.Name, "Namespace" }))); } if (typeElement.ChildNodes.Count > 0) { localName = DataContract.EncodeLocalName(localName); } int num = 0; GenericInfo info = new GenericInfo(new XmlQualifiedName(localName, ns), type.Name); foreach (System.Xml.XmlNode node3 in typeElement.ChildNodes) { XmlElement element = node3 as XmlElement; if (element != null) { if ((element.LocalName != "GenericParameter") || (element.NamespaceURI != "http://schemas.microsoft.com/2003/10/Serialization/")) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(System.Runtime.Serialization.SR.GetString("GenericAnnotationHasInvalidElement", new object[] { element.LocalName, element.NamespaceURI, type.Name }))); } System.Xml.XmlNode node4 = element.Attributes.GetNamedItem("NestedLevel"); int result = 0; if ((node4 != null) && !int.TryParse(node4.Value, out result)) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(System.Runtime.Serialization.SR.GetString("GenericAnnotationHasInvalidAttributeValue", new object[] { element.LocalName, element.NamespaceURI, type.Name, node4.Value, node4.LocalName, Globals.TypeOfInt.Name }))); } if (result < num) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(System.Runtime.Serialization.SR.GetString("GenericAnnotationForNestedLevelMustBeIncreasing", new object[] { element.LocalName, element.NamespaceURI, type.Name }))); } info.Add(this.ImportGenericInfo(element, type)); info.AddToLevel(result, 1); num = result; } } System.Xml.XmlNode node5 = typeElement.Attributes.GetNamedItem("NestedLevel"); if (node5 != null) { int num3 = 0; if (!int.TryParse(node5.Value, out num3)) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(System.Runtime.Serialization.SR.GetString("GenericAnnotationHasInvalidAttributeValue", new object[] { typeElement.LocalName, typeElement.NamespaceURI, type.Name, node5.Value, node5.LocalName, Globals.TypeOfInt.Name }))); } if ((num3 - 1) > num) { info.AddToLevel(num3 - 1, 0); } } return info; }
private CollectionDataContract ImportCollection(XmlQualifiedName typeName, XmlSchemaSequence rootSequence, XmlSchemaObjectCollection attributes, XmlSchemaAnnotation annotation, bool isReference) { CollectionDataContract dataContract = new CollectionDataContract(CollectionKind.Array) { StableName = typeName }; this.AddDataContract(dataContract); dataContract.IsReference = isReference; XmlSchemaElement element = (XmlSchemaElement) rootSequence.Items[0]; dataContract.IsItemTypeNullable = element.IsNillable; dataContract.ItemName = element.Name; XmlSchemaForm form = (element.Form == XmlSchemaForm.None) ? SchemaHelper.GetSchemaWithType(this.SchemaObjects, this.schemaSet, typeName).ElementFormDefault : element.Form; if (form != XmlSchemaForm.Qualified) { ThrowArrayTypeCannotBeImportedException(typeName.Name, typeName.Namespace, System.Runtime.Serialization.SR.GetString("ArrayItemFormMustBe", new object[] { element.Name })); } this.CheckIfElementUsesUnsupportedConstructs(typeName, element); if (element.SchemaTypeName.IsEmpty) { if (element.SchemaType != null) { XmlQualifiedName typeQName = new XmlQualifiedName(element.Name, typeName.Namespace); if (this.dataContractSet[typeQName] == null) { dataContract.ItemContract = this.ImportAnonymousElement(element, typeQName); } else { XmlQualifiedName name2 = new XmlQualifiedName(string.Format(CultureInfo.InvariantCulture, "{0}.{1}Type", new object[] { typeName.Name, element.Name }), typeName.Namespace); dataContract.ItemContract = this.ImportAnonymousElement(element, name2); } } else if (!element.RefName.IsEmpty) { ThrowArrayTypeCannotBeImportedException(typeName.Name, typeName.Namespace, System.Runtime.Serialization.SR.GetString("ElementRefOnLocalElementNotSupported", new object[] { element.RefName.Name, element.RefName.Namespace })); } else { dataContract.ItemContract = this.ImportType(SchemaExporter.AnytypeQualifiedName); } } else { dataContract.ItemContract = this.ImportType(element.SchemaTypeName); } if (this.IsDictionary(typeName, annotation)) { ClassDataContract itemContract = dataContract.ItemContract as ClassDataContract; DataMember dataMember = null; DataMember member2 = null; if (((itemContract == null) || (itemContract.Members == null)) || (((itemContract.Members.Count != 2) || !(dataMember = itemContract.Members[0]).IsRequired) || !(member2 = itemContract.Members[1]).IsRequired)) { ThrowArrayTypeCannotBeImportedException(typeName.Name, typeName.Namespace, System.Runtime.Serialization.SR.GetString("InvalidKeyValueType", new object[] { element.Name })); } if (itemContract.Namespace != dataContract.Namespace) { ThrowArrayTypeCannotBeImportedException(typeName.Name, typeName.Namespace, System.Runtime.Serialization.SR.GetString("InvalidKeyValueTypeNamespace", new object[] { element.Name, itemContract.Namespace })); } itemContract.IsValueType = true; dataContract.KeyName = dataMember.Name; dataContract.ValueName = member2.Name; if (element.SchemaType != null) { this.dataContractSet.Remove(itemContract.StableName); GenericInfo info = new GenericInfo(DataContract.GetStableName(Globals.TypeOfKeyValue), Globals.TypeOfKeyValue.FullName); info.Add(this.GetGenericInfoForDataMember(dataMember)); info.Add(this.GetGenericInfoForDataMember(member2)); info.AddToLevel(0, 2); dataContract.ItemContract.StableName = new XmlQualifiedName(info.GetExpandedStableName().Name, typeName.Namespace); } } return dataContract; }