/*
* Namespace Summary
* Copyright (C) 2005+ Bogdan Damian Constantin
* E-Mail: damianbcpetro@gmail.com
* WEB: http://www.sourceforge.net/projects/dataholder
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License 2.1 or later, as
* published by the Free Software Foundation. See the included License.txt
* or http://www.gnu.org/copyleft/lesser.html for details.
*
*/
using System;
using System.Xml;
namespace DataHolder.Containers.Property{
/// <summary>
/// Property that will contain other types than symple types like aanother generic data, Generic data collection etc
/// </summary>
public class TypedProperty : GenericDataProperty
{
private Type _PropertyType;
private string _PropertyName;
private PreSerializatonActionDelegate l_PreSerializatonAction = null;
bool _AutoCreate = true;
public TypedProperty(string Name, Type type)
{
_PropertyType = type;
_PropertyName = Name;
if(_PropertyType.IsSubclassOf(typeof(GenericData)))
l_PreSerializatonAction = new PreSerializatonActionDelegate(SerializationHelper.GenericDataPreSerializatonAction);
else if(_PropertyType.IsSubclassOf(typeof(GenericDataCollection)))
l_PreSerializatonAction = new PreSerializatonActionDelegate(SerializationHelper.CollectionGenericDataPreSerializatonAction);
else
l_PreSerializatonAction = null;
}
public TypedProperty(string Name, Type type, bool autoCreate):this(Name, type)
{
_AutoCreate = autoCreate;
}
public TypedProperty(string Name, Type type, bool autoCreate, IPropAttribute [] pAttributes):this(Name, type, autoCreate)
{
locAttributes = pAttributes;
}
public override string PropertyName
{
get{return _PropertyName;}
set{_PropertyName = value;}
}
public override Type PropertyType
{
get{return _PropertyType;}
set{_PropertyType = value;}
}
public override void PreSerializatonAction(object data, SerializationHelper srinfo)
{
if(l_PreSerializatonAction != null && data != null)
l_PreSerializatonAction(data, srinfo);
}
public bool AutoCreate
{
get{return _AutoCreate;}
}
public override void WriteXml(XmlWriter writer, GenericData ge, int PropertyIndex,
bool SerializeOriginalValues, bool SerializeIntermediarValues)
{
writer.WriteStartElement(this.PropertyName);
if( ge[PropertyIndex] is GenericData)
((GenericData)ge[PropertyIndex]).WriteXml(writer);
else if(ge[PropertyIndex] is GenericDataCollection)
((GenericDataCollection)ge[PropertyIndex]).WriteXml(writer);
writer.WriteEndElement();
}
public override void ReadXml(XmlReader reader, GenericData ge,
bool DeSerializeOriginalValues, bool DeSerializeIntermediarValues)
{
if(reader.IsStartElement(this.PropertyName))
{
if(reader.IsEmptyElement)
{
//DO NOTHING
}
else if(this.PropertyType.IsSubclassOf(typeof(GenericData)))
{
GenericData loadedge = (GenericData)Activator.CreateInstance(this.PropertyType);
loadedge.ReadXml(reader);
loadedge.Parent = ge;
ge[this.PropertyName] = loadedge;
}
else if(this.PropertyType.IsSubclassOf(typeof(GenericDataCollection)))
{
GenericDataCollection gecoll = (GenericDataCollection)Activator.CreateInstance(this.PropertyType);
gecoll.ReadXml(reader);
gecoll.Parent = ge;
ge[this.PropertyName] = gecoll;
}
else
throw new Exception("Don't know how to handle " + this.PropertyType.ToString());
}
else
throw new Exception("XML Transformation Error, the type from the xml differs from the system type");
//read the end element
// reader.Read();
}
}
}
|