protected virtual ParameterExpression GetParameter(Type type, string name)
        {
            var key = KeyMaker.GetHashCode(type, name);
            ParameterExpression result = null;

            if (!_params.TryGetValue(key, out result))
            {
                result       = Expression.Parameter(type, name);
                _params[key] = result;
            }
            return(result);
        }
        protected void AddHash(object item)
        {
            if (item is TypeInfo type)
            {
                var h = type.Name.GetHashCode();

                var hashType = type.UnderlyingSystemType;
                if (hashType != null && hashType.AssemblyQualifiedName != null)
                {
                    h = KeyMaker.AddHashCode(h, hashType.AssemblyQualifiedName.GetHashCode());
                }

                Hash = KeyMaker.AddHashCode(Hash, h);
            }

            if (item is MemberInfo member)
            {
                var h = member.Name.GetHashCode();

                var hashType = member.DeclaringType;
                if (hashType != null && hashType.AssemblyQualifiedName != null)
                {
                    h = KeyMaker.AddHashCode(h, hashType.AssemblyQualifiedName.GetHashCode());
                }
                Hash = KeyMaker.AddHashCode(Hash, h);
                return;
            }

            if (item == null)
            {
                Hash = KeyMaker.AddHashCode(Hash, NullHashCode);
            }
            else
            {
                Hash = KeyMaker.AddHashCode(Hash, KeyMaker.GetHashCode(item));
            }
        }