Exemple #1
0
 public ObjectConverter GetObjectConverter(Type type)
 {
     return(_dtoCache.GetConverter(type));
 }
        ObjectMapper <TImplementation> GetDictionaryToObjectConverter(
            ReadWriteProperty <TImplementation> property, Type valueType)
        {
            Type underlyingType = Nullable.GetUnderlyingType(valueType);

            if (underlyingType != null)
            {
                Type converterType =
                    typeof(NullableValueObjectMapper <,>).MakeGenericType(typeof(TImplementation),
                                                                          underlyingType);

                return((ObjectMapper <TImplementation>)Activator.CreateInstance(converterType, property));
            }

            if (valueType.IsEnum)
            {
                return(new EnumObjectMapper <TImplementation>(property));
            }

            if (valueType.IsArray)
            {
                Type elementType = valueType.GetElementType();
                if (elementType.IsValueType || elementType == typeof(string))
                {
                    Type valueConverterType = typeof(ValueArrayObjectMapper <,>).MakeGenericType(
                        typeof(TImplementation), elementType);
                    return((ObjectMapper <TImplementation>)Activator.CreateInstance(valueConverterType, property));
                }

                ObjectConverter elementConverter = _cache.GetConverter(elementType);

                Type converterType = typeof(ObjectArrayObjectMapper <,>).MakeGenericType(typeof(TImplementation),
                                                                                         elementType);
                return
                    ((ObjectMapper <TImplementation>)Activator.CreateInstance(converterType, property, elementConverter));
            }

            if (valueType.IsValueType || valueType == typeof(string))
            {
                return(new ValueObjectMapper <TImplementation>(property));
            }

            if (valueType.ClosesType(typeof(IEnumerable <>)))
            {
                if (valueType.ClosesType(typeof(IDictionary <,>)))
                {
                    Type[] genericArguments = valueType.GetClosingArguments(typeof(IDictionary <,>)).ToArray();

                    Type keyType     = genericArguments[0];
                    Type elementType = genericArguments[1];


                    if (keyType.IsValueType || keyType == typeof(string))
                    {
                        if (elementType.IsValueType || elementType == typeof(string))
                        {
                            Type valueConverterType =
                                typeof(ValueValueDictionaryObjectMapper <, ,>).MakeGenericType(typeof(TImplementation),
                                                                                               keyType, elementType);
                            return((ObjectMapper <TImplementation>)Activator.CreateInstance(valueConverterType, property));
                        }
                        else
                        {
                            ObjectConverter elementConverter   = _cache.GetConverter(elementType);
                            Type            valueConverterType =
                                typeof(ValueObjectDictionaryObjectMapper <, ,>).MakeGenericType(typeof(TImplementation),
                                                                                                keyType, elementType);
                            return
                                ((ObjectMapper <TImplementation>)
                                 Activator.CreateInstance(valueConverterType, property, elementConverter));
                        }
                    }

                    throw new InvalidOperationException("A dictionary with a reference type key is not supported: "
                                                        + property.Property.Name);
                }


                if (valueType.ClosesType(typeof(IList <>)) || valueType.ClosesType(typeof(IEnumerable <>)))
                {
                    Type[] genericArguments = valueType.GetClosingArguments(typeof(IEnumerable <>)).ToArray();
                    Type   elementType      = genericArguments[0];

                    if (elementType.IsValueType || elementType == typeof(string))
                    {
                        Type valueConverterType =
                            typeof(ValueListObjectMapper <,>).MakeGenericType(typeof(TImplementation),
                                                                              elementType);

                        return((ObjectMapper <TImplementation>)Activator.CreateInstance(valueConverterType, property));
                    }

                    ObjectConverter elementConverter = _cache.GetConverter(elementType);

                    Type converterType = typeof(ObjectListObjectMapper <,>).MakeGenericType(typeof(TImplementation),
                                                                                            elementType);

                    return((ObjectMapper <TImplementation>)Activator.CreateInstance(converterType, property,
                                                                                    elementConverter));
                }
            }

            return(new ObjectObjectMapper <TImplementation>(property, _cache.GetConverter(valueType)));
        }