internal TO GetInternal <TO>(Guid _uid, IXObjectFactory <TKind> _factory) where TO : ClientXObject <TKind> { if (_factory == null && typeof(TO).IsAbstract) { var xFactoryAttribute = typeof(TO).GetCustomAttributes(typeof(XFactoryAttribute), true).Cast <XFactoryAttribute>().SingleOrDefault(); if (xFactoryAttribute == null) { throw new ApplicationException("Can't instantiate abstract type"); } _factory = (IXObjectFactory <TKind>)Activator.CreateInstance(xFactoryAttribute.FactoryType); } ClientXObjectDescriptor <TKind> descriptor; if (m_descriptors.TryGetValue(_uid, out descriptor)) { return(descriptor.Get <TO>(_factory)); } var collectionOwnerUid = m_transport.GetСollectionOwnerUid(_uid); descriptor = new ClientXObjectDescriptor <TKind>(_uid, this, collectionOwnerUid); m_descriptors.Add(_uid, descriptor); var result = descriptor.Get <TO>(_factory); return(result); }
public TO Get <TO>(IXObjectFactory <TKind> _factory) where TO : ClientXObject <TKind> { ClientXObject <TKind> result; var type = typeof(TO); if (!m_instances.TryGetValue(type, out result)) { if (_factory == null) { if (type.IsAbstract) { throw new ApplicationException("Can't instantiate abstract type, please init _factory arg"); } result = (ClientXObject <TKind>)Activator.CreateInstance(typeof(TO)); if (m_notInitialized) { Kind = m_client.KindToIntInternal(result.Kind); } } else { if (m_notInitialized) { Kind = m_client.KindToIntInternal(_factory.Kind); } result = (ClientXObject <TKind>)_factory.CreateInstance(m_client.IntToKindInternal(Report.Kind)); var newType = result.GetType(); ClientXObject <TKind> existed; if (m_instances.TryGetValue(newType, out existed)) { m_instancesCounter[existed]++; return((TO)existed); } m_instances.Add(type, result); type = newType; } var child = result as IClientXChildObject <TKind>; if (child != null) { child.SetParent(CollectionOwnerUid); } result.SetUid(Report.Uid); result.SetClientInternal(m_client); result.ApplyChanges(Report, true); result.Changed += XObjectChanged; m_instances.Add(type, result); m_instancesCounter.Add(result, 1); result.OnInstantiationFinished(); } else { m_instancesCounter[result]++; } return((TO)result); }
internal TO GetInternal <TO>(Guid _uid, IXObjectFactory <TKind> _factory, Guid _collectionOwnerUid) where TO : ClientXObject <TKind> { ClientXObjectDescriptor <TKind> descriptor; TO result; if (!m_descriptors.TryGetValue(_uid, out descriptor)) { descriptor = new ClientXObjectDescriptor <TKind>(_uid, this, _collectionOwnerUid); m_descriptors.Add(_uid, descriptor); result = descriptor.Get <TO>(_factory); } else { if (!descriptor.ContainsInstanceOf(out result)) { result = descriptor.Get <TO>(_factory); } } return(result); }
internal XRef(IXObjectFactory <TKind> _factory) { m_factory = _factory; }
internal XCollection(IXObjectFactory <TKind> _factory) { m_factory = _factory; }