Пример #1
0
        internal static ObjectData ToData(ObjectDataConverter converter,
                                          object @object, ObjectDataConvertSettings settings, ObjectDataConvertSession session)
        {
            if (session == null)
            {
                session = new ObjectDataConvertSession();
            }
            if (session.TryGetConvertedData(@object, out var data))
            {
                return(data);
            }

            if (settings == null)
            {
                settings = ObjectDataConvertSettings.Default;
            }

            var type = @object.GetType();

            if (converter == null)
            {
                converter = SelectConverter(settings, type);
            }

            var members = converter.ToDataMembers(@object, settings, session);

            data = new ObjectData(type, members);
            session.AddConverted(@object, data);
            return(data);
        }
Пример #2
0
 private static bool FindInType(
     IReadOnlyObjectDataConverterCollection collection, Type type, out ObjectDataConverter converter)
 {
     return(type.IsGenericType
         ? collection.TryGetConverter(type.GetGenericTypeDefinition(), out converter)
         : collection.TryGetConverter(type, out converter));
 }
Пример #3
0
 public static Data ToData(object @object,
                           ObjectDataConvertSettings settings = null, ObjectDataConvertSession session = null)
 {
     if (ValueData.TryCreate(@object, out var valueData))
     {
         return(valueData);
     }
     return(ObjectDataConverter.ToData(null, @object, settings, session));
 }
Пример #4
0
        public static bool TryGetConverter(
            this IReadOnlyObjectDataConverterCollection self, Type convertType, out ObjectDataConverter converter)
        {
            if (!self.TryGetConverters(convertType, out var converters) || converters.Count == 0)
            {
                converter = null;
                return(false);
            }

            converter = converters.First();
            return(true);
        }
Пример #5
0
        private static bool FindInBaseTypes(
            IReadOnlyObjectDataConverterCollection collection, Type type, out ObjectDataConverter converter)
        {
            var p = type.BaseType;

            while (p != null)
            {
                if (FindInType(collection, p, out converter))
                {
                    return(true);
                }
                p = p.BaseType;
            }

            converter = null;
            return(false);
        }
Пример #6
0
        public static object ToObject(Data data,
                                      ObjectDataConvertSettings settings = null, ObjectDataConvertSession session = null)
        {
            switch (data)
            {
            case null:
                throw new ArgumentNullException(nameof(data));

            case ValueData valueData:
                return(valueData.Value);

            case ObjectData objectData:
                return(ObjectDataConverter.ToObject(null, objectData, settings, session));

            default:
                throw new NotSupportedException($"Create object for '{data.GetType()}' is not supported.");
            }
        }
Пример #7
0
        internal static object ToObject(ObjectDataConverter converter,
                                        ObjectData data, ObjectDataConvertSettings settings, ObjectDataConvertSession session)
        {
            if (session == null)
            {
                session = new ObjectDataConvertSession();
            }
            if (session.TryGetConvertedObject(data, out var @object))
            {
                return(@object);
            }

            if (settings == null)
            {
                settings = ObjectDataConvertSettings.Default;
            }

            if (converter == null)
            {
                converter = SelectConverter(settings, data.ObjectType);
            }

            @object = CreateObjectByDataConstructor(data);
            if (!ReferenceEquals(@object, null))
            {
                session.AddConverted(@object, data);
                return(@object);
            }

            @object = converter.CreateObject(data, settings, session);
            if (ReferenceEquals(@object, null))
            {
                return(null);
            }

            converter.PopulateObjectMembers(@object, data, settings, session);
            session.AddConverted(@object, data);
            return(@object);
        }
Пример #8
0
        private static bool FindInInterfaces(
            IReadOnlyObjectDataConverterCollection collection, Type type, out ObjectDataConverter converter)
        {
            var interfaces = type.GetMostDerivedInterfaces();

            foreach (var @interface in interfaces)
            {
                if (FindInType(collection, @interface, out converter))
                {
                    return(true);
                }
            }

            foreach (var @interface in interfaces)
            {
                if (FindInInterfaces(collection, @interface, out converter))
                {
                    return(true);
                }
            }

            converter = null;
            return(false);
        }