internal static DynamicProxy GetOrAdd(Type type)
        {
            DynamicProxy proxy = null;

            using (var readLock = ReadWriteLocker.AcquireUpgradeableReadLock()) {
                if (!_cache.TryGetValue(type, out proxy))
                {
                    using (var writeLock = readLock.UpgradeToWriterLock()) {
                        proxy = type.CreateProxy();
                        _cache.GetOrAdd(type, proxy);
                    }
                }

                return(proxy);
            }
        }
 internal static DynamicProxy Cache(Type type)
 {
     return(_cache.GetOrAdd(type, DynamicProxy.Wrap(type)));
 }