Exemplo n.º 1
0
        internal override object GetInternal(Type t, Func <IEnumerable <string> > getMyKeyChain)
        {
            if (t == Types.TomlTableType)
            {
                return(this);
            }

            var ctx = new TomlSettings.CreateInstanceContext(getMyKeyChain());

            var activatedType = t;

            if (this.Root.Settings.TryGetUserActivatedInstance(t, ctx, out var result))
            {
                activatedType = result.GetType();
            }

            var conv = this.Root.Settings.TryGetConverter(Types.TomlTableType, activatedType);

            if (conv != null)
            {
                return(conv.Convert(this.Root, this, t));
            }

            result = this.Root.Settings.GetActivatedInstance(t, ctx);
            foreach (var r in this.rows)
            {
                var targetMember = this.Root.Settings.TryGetMappedMember(result.GetType(), r.Key.Value);
                if (targetMember.HasValue)
                {
                    Type keyMapingTargetType = this.Root.Settings.TryGetMappedType(r.Key.Value, targetMember);

                    object value = null;
                    try
                    {
                        value = r.Value.GetInternal(
                            keyMapingTargetType ?? targetMember.Value.MemberType,
                            () => getMyKeyChain().Concat(r.Key.Value.ToEnumerable()));
                    }
                    catch (Exception exc)
                    {
                        throw new InvalidOperationException(
                                  $"Failed to convert TOML object with key '{r.Key}', " + $"type '{r.Value.ReadableTypeName}' " +
                                  $"and value '{r.Value}' to object property " +
                                  $"with name '{targetMember.Value.MemberInfo.Name}' and type '{targetMember.Value.MemberType.FullName}'.",
                                  exc);
                    }

                    targetMember.Value.SetValue(result, value);
                }
                else
                {
                    this.Root.Settings.OnTargetPropertyNotFound(
                        getMyKeyChain().Concat(r.Key.Value.ToEnumerable()).ToArray(), result, r.Value);
                }
            }

            return(result);
        }
        public object Convert(ITomlRoot root, object value, Type targetType)
        {
            var table       = (TomlTable)value;
            var ctx         = new TomlSettings.CreateInstanceContext((string)null);
            var converted   = (IDictionary)table.Root.Settings.GetActivatedInstance(targetType, ctx);
            var elementType = DictReflectUtil.GetElementType(converted.GetType());

            foreach (var r in table.Rows)
            {
                converted[r.Key] = r.Value.GetInternal(elementType, r.Key.ToEnumerable);
            }

            return(converted);
        }