private void UpdateFrameProcessors() { var requiredTypes = new List <Type>(); var fb = Behaviours.Count(); var requestedTypes = Behaviours.Where(b => b.RequestedFrameProcessors != null).SelectMany(b => b.RequestedFrameProcessors); if (requestedTypes != null) { requiredTypes.AddRange(requestedTypes.Distinct()); } var presentTypes = FrameProcessors.Select(p => p.GetType()).Distinct(); var toRemove = presentTypes.Where(t => !requiredTypes.Contains(t)).ToList(); var toAdd = requiredTypes.Where(t => !presentTypes.Contains(t)); FrameProcessors.Where(p => toRemove.Contains(p.GetType())).ToList().ForEach(p => p.Dispose()); FrameProcessors.RemoveAll(p => toRemove.Contains(p.GetType())); FrameProcessors.AddRange(toAdd.Select(t => (ICameraFrameProcessor)Activator.CreateInstance(t))); }