private static IFormatter <T> Create()
        {
            if (typeof(T) == typeof(sbyte))
            {
                return((IFormatter <T>)(object) new SByteFormatter());
            }

            if (typeof(T) == typeof(byte))
            {
                return((IFormatter <T>)(object) new ByteFormatter());
            }

            if (typeof(T) == typeof(short))
            {
                return((IFormatter <T>)(object) new Int16Formatter());
            }

            if (typeof(T) == typeof(ushort))
            {
                return((IFormatter <T>)(object) new UInt16Formatter());
            }

            if (typeof(T) == typeof(int))
            {
                return((IFormatter <T>)(object) new Int32Formatter());
            }

            if (typeof(T) == typeof(uint))
            {
                return((IFormatter <T>)(object) new UInt32Formatter());
            }

            if (typeof(T) == typeof(long))
            {
                return((IFormatter <T>)(object) new Int64Formatter());
            }

            if (typeof(T) == typeof(ulong))
            {
                return((IFormatter <T>)(object) new UInt64Formatter());
            }

            if (typeof(T) == typeof(bool))
            {
                return((IFormatter <T>)(object) new BooleanFormatter());
            }

            if (typeof(T) == typeof(char))
            {
                return((IFormatter <T>)(object) new CharFormatter());
            }

            if (typeof(T) == typeof(float))
            {
                return((IFormatter <T>)(object) new SingleFormatter());
            }

            if (typeof(T) == typeof(double))
            {
                return((IFormatter <T>)(object) new DoubleFormatter());
            }

            if (typeof(T) == typeof(string))
            {
                return((IFormatter <T>)(object) new StringFormatter());
            }

            if (typeof(T) == typeof(sbyte[]))
            {
                return((IFormatter <T>)(object) new SByteArrayFormatter());
            }

            if (typeof(T) == typeof(byte[]))
            {
                return((IFormatter <T>)(object) new ByteArrayFormatter());
            }

            if (typeof(T) == typeof(short[]))
            {
                return((IFormatter <T>)(object) new Int16ArrayFormatter());
            }

            if (typeof(T) == typeof(ushort[]))
            {
                return((IFormatter <T>)(object) new UInt16ArrayFormatter());
            }

            if (typeof(T) == typeof(int[]))
            {
                return((IFormatter <T>)(object) new Int32ArrayFormatter());
            }

            if (typeof(T) == typeof(uint[]))
            {
                return((IFormatter <T>)(object) new UInt32ArrayFormatter());
            }

            if (typeof(T) == typeof(long[]))
            {
                return((IFormatter <T>)(object) new Int64ArrayFormatter());
            }

            if (typeof(T) == typeof(ulong[]))
            {
                return((IFormatter <T>)(object) new UInt64ArrayFormatter());
            }

            if (typeof(T) == typeof(bool[]))
            {
                return((IFormatter <T>)(object) new BooleanArrayFormatter());
            }

            if (typeof(T) == typeof(char[]))
            {
                return((IFormatter <T>)(object) new CharArrayFormatter());
            }

            if (typeof(T) == typeof(float[]))
            {
                return((IFormatter <T>)(object) new SingleArrayFormatter());
            }

            if (typeof(T) == typeof(double[]))
            {
                return((IFormatter <T>)(object) new DoubleArrayFormatter());
            }

            if (typeof(T) == typeof(string[]))
            {
                return((IFormatter <T>)(object) new StringArrayFormatter());
            }

            if (typeof(T).IsEnum)
            {
                return(EnumFormatter.Create <T>());
            }

            if (typeof(T).IsArray)
            {
                return(ArrayFormatter.Create <T>());
            }

            if (typeof(T).IsAbstract)
            {
                return(UnionFormatter.Create <T>());
            }

            return(ObjectFormatter.Create <T>());
        }