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); }