using System; using System.Reflection; using System.Xml; using oodb.attributes; namespace oodb.mapping.collections { public class ISetExtendedHandling : ExtendedFieldHandling { public Type ReferencedType { get; } public FieldInfo ReferencedField { get; protected set; } public Type ImplementationType { get; } public ISetExtendedHandling(OODB oodb,FieldInfo fieldInfo) :base(oodb,fieldInfo) { ReferencedType = fieldInfo.FieldType.GetGenericArguments()[0]; ImplementationType = typeof(ISetImplementation<>).MakeGenericType(ReferencedType); } public override void Initialize() { ReferencedFieldAttribute referencedFieldAttribute = FieldInfo.GetCustomAttribute(); string refFieldName = referencedFieldAttribute != null ? referencedFieldAttribute.FieldName : FieldInfo.DeclaringType.Name; ReferencedField = ReferencedType.GetField(refFieldName, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); OODB.StorageAdapter.GetSearchIndex(ReferencedField); } public override void Attach(Persistent persistent) { object iset = FieldInfo.GetValue(persistent); if (ImplementationType != iset.GetType()) { object impl = Activator.CreateInstance(ImplementationType,OODB,FieldInfo,persistent); FieldInfo.SetValue(persistent, impl); } } public override void Detach(Persistent persistent) { } public override void Load(XmlElement persistenceElement, Persistent persistent) { Attach(persistent); } public override void Save(XmlElement persistenceElement, Persistent persistent) { } } }