public ChangeTracker(object target) { Target = target; var type = Target.GetType(); lock (FieldCache) { if (!FieldCache.ContainsKey(type)) { FieldCache.Add(type, type.GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.FlattenHierarchy).ToList()); } } Fields = FieldCache[type].Select(each => new ChangeTrackerField(each)).ToList(); GetChanges(); }