private Tuple <ITypeMap, ITypeMap> AddTypeMap(ParticleDefinition particleDefinition, XName qualifiedName) { var typeDefinition = GetRuntimeTypeDefinition(particleDefinition, qualifiedName); if (typeDefinition == null) { return(null); } if (qualifiedName.NamespaceName != typeDefinition.Name.NamespaceName) { throw new UnknownTypeException(particleDefinition, typeDefinition, qualifiedName); } if (typeDefinition.IsCompositeType && typeDefinition.Type.GetTypeInfo().GetConstructor(Type.EmptyTypes) == null) { throw new SchemaDefinitionException($"The runtime type '{typeDefinition.Name}' does not define default constructor."); } ITypeMap typeMap; if (typeDefinition.TypeMapType != null) { typeMap = (ITypeMap)Activator.CreateInstance(typeDefinition.TypeMapType, this, typeDefinition); } else if (typeDefinition.Type.GetTypeInfo().IsEnum) { typeMap = (ITypeMap)Activator.CreateInstance(typeof(EnumTypeMap), typeDefinition); } else if (typeDefinition.Type.GetTypeInfo().IsAbstract) { typeMap = (ITypeMap)Activator.CreateInstance(typeof(AbstractTypeMap), typeDefinition); } else if (typeDefinition.HasStrictContentOrder) { typeMap = (ITypeMap)Activator.CreateInstance(typeof(SequenceTypeMap <>).MakeGenericType(typeDefinition.Type), this, typeDefinition); } else { typeMap = (ITypeMap)Activator.CreateInstance(typeof(AllTypeMap <>).MakeGenericType(typeDefinition.Type), this, typeDefinition); } var arrayTypeMap = (ITypeMap)Activator.CreateInstance(typeof(ArrayTypeMap <>).MakeGenericType(typeDefinition.Type), this, schemaDefinitionProvider.GetCollectionDefinition(typeDefinition), typeMap); var typeMapTuple = Tuple.Create(typeMap, arrayTypeMap); if (!(typeMap is ICompositeTypeMap compositeTypeMap)) { return(xmlTypeMaps.GetOrAdd(qualifiedName, typeMapTuple)); } var partialTypeMaps = new Dictionary <Type, ITypeMap> { { compositeTypeMap.Definition.Type, compositeTypeMap }, { arrayTypeMap.Definition.Type, arrayTypeMap } }; compositeTypeMap.InitializeProperties(GetRuntimeProperties(typeDefinition, partialTypeMaps), availableFilters); return(xmlTypeMaps.GetOrAdd(qualifiedName, typeMapTuple)); }
private Tuple <ITypeMap, ITypeMap> AddTypeMap(XName qualifiedName) { var typeDefinition = GetRuntimeTypeDefinition(qualifiedName); if (typeDefinition == null) { return(null); } if (qualifiedName.NamespaceName != typeDefinition.Name.NamespaceName) { throw XRoadException.UnknownType(qualifiedName.ToString()); } if (!typeDefinition.Type.GetTypeInfo().IsEnum&& !typeDefinition.Type.GetTypeInfo().IsAbstract&& typeDefinition.Type.GetTypeInfo().GetConstructor(Type.EmptyTypes) == null) { throw XRoadException.NoDefaultConstructorForType(typeDefinition.Name); } ITypeMap typeMap; if (typeDefinition.TypeMapType != null) { typeMap = (ITypeMap)Activator.CreateInstance(typeDefinition.TypeMapType, this, typeDefinition); } else if (typeDefinition.Type.GetTypeInfo().IsEnum) { typeMap = (ITypeMap)Activator.CreateInstance(typeof(EnumTypeMap), typeDefinition); } else if (typeDefinition.Type.GetTypeInfo().IsAbstract) { typeMap = (ITypeMap)Activator.CreateInstance(typeof(AbstractTypeMap), typeDefinition); } else if (typeDefinition.HasStrictContentOrder) { typeMap = (ITypeMap)Activator.CreateInstance(typeof(SequenceTypeMap <>).MakeGenericType(typeDefinition.Type), this, typeDefinition); } else { typeMap = (ITypeMap)Activator.CreateInstance(typeof(AllTypeMap <>).MakeGenericType(typeDefinition.Type), this, typeDefinition); } var arrayTypeMap = (ITypeMap)Activator.CreateInstance(typeof(ArrayTypeMap <>).MakeGenericType(typeDefinition.Type), this, schemaDefinitionProvider.GetCollectionDefinition(typeDefinition), typeMap); var typeMapTuple = Tuple.Create(typeMap, arrayTypeMap); var compositeTypeMap = typeMap as ICompositeTypeMap; if (compositeTypeMap == null) { return(xmlTypeMaps.GetOrAdd(qualifiedName, typeMapTuple)); } var partialTypeMaps = new Dictionary <Type, ITypeMap> { { compositeTypeMap.Definition.Type, compositeTypeMap }, { arrayTypeMap.Definition.Type, arrayTypeMap } }; compositeTypeMap.InitializeProperties(GetRuntimeProperties(typeDefinition, partialTypeMaps), availableFilters); return(xmlTypeMaps.GetOrAdd(qualifiedName, typeMapTuple)); }