public override int GetHashCode()
        {
            // ensure initialization before accessing MixinData
            Initialize();

            var result = Hook != null?Hook.GetType().GetHashCode() : 0;

            result = 29 * result + (Selector != null ? 1 : 0);
            result = 29 * result + MixinData.GetHashCode();
            result = 29 * result + (BaseTypeForInterfaceProxy != null ? BaseTypeForInterfaceProxy.GetHashCode() : 0);
            result = 29 * result + CollectionExtensions.GetContentsHashCode(AdditionalAttributes);
            return(result);
        }
        public override bool Equals(object obj)
        {
            if (ReferenceEquals(this, obj))
            {
                return(true);
            }

            var proxyGenerationOptions = obj as ProxyGenerationOptions;

            if (ReferenceEquals(proxyGenerationOptions, null))
            {
                return(false);
            }

            // ensure initialization before accessing MixinData
            Initialize();
            proxyGenerationOptions.Initialize();

            if (!Equals(Hook, proxyGenerationOptions.Hook))
            {
                return(false);
            }
            if (!Equals(Selector == null, proxyGenerationOptions.Selector == null))
            {
                return(false);
            }
            if (!Equals(MixinData, proxyGenerationOptions.MixinData))
            {
                return(false);
            }
            if (!Equals(BaseTypeForInterfaceProxy, proxyGenerationOptions.BaseTypeForInterfaceProxy))
            {
                return(false);
            }
            if (!CollectionExtensions.AreEquivalent(AdditionalAttributes, proxyGenerationOptions.AdditionalAttributes))
            {
                return(false);
            }
            return(true);
        }