private static void BuildTrackablePocoProperty <TPoco>(PropertyItem item, RedisTypeConverter typeConverter) where TPoco : ITrackablePoco <TPoco> { var mapper = new TrackablePocoRedisMapper <TPoco>(typeConverter); item.Mapper = mapper; item.CreateAsync = (db, container, key) => { var value = (TPoco)item.PropertyInfo.GetValue(container); return(mapper.CreateAsync(db, value, key.Append(item.KeySuffix))); }; item.DeleteAsync = (db, key) => { return(mapper.DeleteAsync(db, key.Append(item.KeySuffix))); }; item.LoadAsync = (db, container, key) => { var value = (TPoco)item.PropertyInfo.GetValue(container); // when there is no entry for poco, it is regarded as non-existent container. return(mapper.LoadAsync(db, value, key.Append(item.KeySuffix))); }; item.SaveAsync = async(db, tracker, key) => { var valueTracker = (TrackablePocoTracker <TPoco>)item.TrackerPropertyInfo.GetValue(tracker); if (valueTracker.HasChange) { await mapper.SaveAsync(db, valueTracker, key.Append(item.KeySuffix)); } }; }