protected override void AddNode(INode node, bool named, Action <INode> modify) { if (!SpecifiedType.IsGenericDictionary) { throw new TypeNotSupportedException( "non generic dictionary", SpecifiedType, Mode.Deserialize, "generic dictionaries"); } if (node.IsNamed && _itemType.CanBeCastTo <INode>()) { if (_itemType.Is <INode>() || _itemType.IsTypeOf(node)) { _dictionary.Value.Add(node.Name, node); } } else { if (Context.Options.TypeFilter.WhenNot(_itemType, Context.Options)) { return; } var value = ValueFactory.Create(_itemType); NodeFactory.CreateDeserializable(node.Name, value, this, Context).Configure(modify); _dictionary.Value.Add(node.Name, value.Instance); } }
protected override void AddNode(INode node, bool named, Action <INode> modify) { const string supported = "generic lists and generic enumerable interfaces"; if (!SpecifiedType.IsGenericEnumerable) { throw new TypeNotSupportedException( "non generic {0}".ToFormat(SpecifiedType.IsList ? "list" : "enumerable"), SpecifiedType, Mode.Deserialize, supported); } if (_itemType.CanBeCastTo <INode>()) { if (_itemType.Is <INode>() || _itemType.IsTypeOf(node)) { _list.Value.Add(node); } } else { if (Context.Options.TypeFilter.WhenNot(_itemType, Context.Options)) { return; } if (!ActualType.IsList) { throw new TypeNotSupportedException( "enumerable", ActualType, Mode.Deserialize, supported); } if (named) { var itemName = GetItemName(_itemType); if (!node.Name.Equals(itemName, Context.Options.Deserialization.NameComparison)) { if (Context.Options.Deserialization.IgnoreUnmatchedArrayItems) { return; } if (!Context.Options.Deserialization.IgnoreArrayItemNames) { throw new InvalidItemNameDeserializationException(node.Name, itemName); } } } var value = ValueFactory.Create(_itemType); NodeFactory.CreateDeserializable(named ? Name : null, value, this, Context).Configure(modify); _list.Value.Add(value.Instance); } }