public void PublishObject(ILiveObject obj) { var typeDesc = (ObjectDescriptor)TypeContext.GetTypeDescriptor(obj.GetType()); var objId = obj.ResourceId; if (String.IsNullOrEmpty(objId)) { throw new Exception("Cannot publish a LiveObject with missing ResourceId!"); } var existingObj = ObjectRepository.GetValueOrDefault(objId); //if (existingObj != null && existingObj != obj) // throw new Exception($"Object's key is not unique: {objId}"); if (existingObj != null && existingObj != obj) { Logger.Log($"[Warning] Object's key is not unique: {objId}"); } ObjectRepository[objId] = obj; if (TrackChanges) { if (obj is INotifyPropertyChanged) { ((INotifyPropertyChanged)obj).PropertyChanged += OnObjectPropertyChanged; } foreach (var propDesc in typeDesc.Properties.Values.Where(x => typeof(INotifyCollectionChanged).IsAssignableFrom(x.PropertyInfo.PropertyType))) { var propValue = (INotifyCollectionChanged)propDesc.PropertyInfo.GetValue(obj); if (propValue == null) { continue; } propValue.CollectionChanged += (sender, args) => ListChanged?.Invoke(this, obj, propDesc, args); } } }