public ChangeTracker(T target) { Target = target; var type = Target.GetType(); lock (PropertyCache) { if (!PropertyCache.ContainsKey(type)) { PropertyCache.Add(type, type.GetProperties().Select(each => each).ToList()); } } Properties = PropertyCache[type].Select(each => new ChangeTrackerProperty(each)).ToList(); GetChanges(); }