XmlCollectionSerializer
using System;
using System.Collections;
namespace Castle.Components.DictionaryAdapter.Xml
{
public abstract class XmlCollectionSerializer : XmlTypeSerializer
{
public override XmlTypeKind Kind => XmlTypeKind.Collection;
public override bool CanGetStub => true;
public abstract Type ListTypeConstructor { get; }
public override object GetStub(IXmlNode node, IDictionaryAdapter parent, IXmlAccessor accessor)
{
return GetValueCore(node, parent, accessor);
}
public override object GetValue(IXmlNode node, IDictionaryAdapter parent, IXmlAccessor accessor)
{
return GetValueCore(node.Save(), parent, accessor);
}
private object GetValueCore(IXmlNode node, IDictionaryAdapter parent, IXmlAccessor accessor)
{
Type type = node.ClrType.GetGenericArguments()[0];
Type type2 = ListTypeConstructor.MakeGenericType(type);
IXmlCollectionAccessor collectionAccessor = accessor.GetCollectionAccessor(type);
return Activator.CreateInstance(type2, node, parent, collectionAccessor);
}
public override void SetValue(IXmlNode node, IDictionaryAdapter parent, IXmlAccessor accessor, object oldValue, ref object value)
{
IXmlNodeSource xmlNodeSource = value as IXmlNodeSource;
if (xmlNodeSource == null || !xmlNodeSource.Node.PositionEquals(node)) {
IEnumerable enumerable = value as IEnumerable;
if (enumerable == null)
throw Error.NotSupported();
(oldValue as ICollectionProjection)?.ClearReferences();
ICollectionProjection collectionProjection = (ICollectionProjection)GetValue(node, parent, accessor);
collectionProjection.Replace(enumerable);
value = collectionProjection;
}
}
}
}