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();
        }