/// <summary>
        /// Create or retrieves from cache a parameter using the classes supplied parameter prefix.
        /// The name is autogenerated. Use the ParameterName property of the returned param in your queries.
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public virtual IDataParameter CreateParameter <TValue>(TValue value)
        {
            ///if TValue is System.Object we need to expand it to generate the correct parameter type
            if (typeof(TValue) == typeof(object) && value.GetType() != typeof(object))
            {
                return(CreateParameterFromObject(value));
            }

            object key = value;

            if (Equals(null, value))
            {
                key = new NullValue <TValue>();
            }

            if (ParameterCache.ContainsKey(key))
            {
                return(ParameterCache[key]);
            }

            IDataParameter p;

            if (value is IGeometry)
            {
                p = Provider.DbUtility.CreateParameter(string.Format("iparam{0}", ParameterCache.Count),
                                                       ((IGeometry)value).AsBinary(),
                                                       ParameterDirection.Input);
            }


            else
            {
                p = Provider.DbUtility.CreateParameter(string.Format("iparam{0}", ParameterCache.Count),
                                                       value,
                                                       ParameterDirection.Input);
            }

            ParameterCache.Add(key, p);

            return(p);
        }