public ProxyBuilder(ProxyKey key)
 {
     parentType     = key.ParentType;
     interfaceTypes = new Type[] {
         key.InterfaceType
     };
 }
        public Type EnsureProxy(Type interfaceType, Type parentType)
        {
            if (parentType == null)
            {
                throw new ArgumentNullException(nameof(parentType));
            }

            if (interfaceType == null)
            {
                throw new ArgumentNullException(nameof(interfaceType));
            }

            var key = new ProxyKey {
                InterfaceType = interfaceType,
                ParentType    = parentType,
            };

            lock (threadLock) {
                if (proxyTypeCache.TryGetValue(key, out var proxyType) == false)
                {
                    proxyTypeCache[key] = proxyType = CreateProxy(key);
                }

                return(proxyType);
            }
        }
        private Type CreateProxy(ProxyKey key)
        {
            var builder = new ProxyBuilder(key);

            return(builder.Build(moduleBuilder));
        }