public T GetBufferGenerator <T> () where T : IBufferGenerator { var t = typeof(T); IBufferGenerator result = null; lock (_AllBufferGenerators) { if (_AllBufferGenerators.TryGetValue(t, out result)) { return((T)result); } } if (_AllowCreatingNewGenerators != 1) { throw new InvalidOperationException("Cannot create a buffer generator after the flush operation has occurred"); } result = (IBufferGenerator)Activator.CreateInstance( t, this ); lock (_AllBufferGenerators) { if (_AllBufferGenerators.TryGetValue(t, out IBufferGenerator lostRace)) { result.Dispose(); return((T)lostRace); } else { _AllBufferGenerators.Add(t, result); } } return((T)result); }