コード例 #1
0
ファイル: Serializer.cs プロジェクト: MuraStranger/XRoadLib
        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));
        }
コード例 #2
0
ファイル: SerializerCache.cs プロジェクト: jaxx/XRoadLib
        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));
        }