public IDataReader GetData(int i)
        {
            ICalculatedField fld = GetCalculatedField(i, typeof(IDataReader));

            if (fld != null)
            {
                return((IDataReader)fld.Value);
            }
            else
            {
                return(BaseReader.GetData(i));
            }
        }
        public char GetChar(int i)
        {
            ICalculatedField fld = GetCalculatedField(i, typeof(char));

            if (fld != null)
            {
                return((char)fld.Value);
            }
            else
            {
                return(BaseReader.GetChar(i));
            }
        }
        public float GetFloat(int i)
        {
            ICalculatedField fld = GetCalculatedField(i, typeof(float));

            if (fld != null)
            {
                return((float)fld.Value);
            }
            else
            {
                return(BaseReader.GetFloat(i));
            }
        }
        public bool GetBoolean(int i)
        {
            ICalculatedField fld = GetCalculatedField(i, typeof(bool));

            if (fld == null)
            {
                return((bool)fld.Value);
            }
            else
            {
                return(BaseReader.GetBoolean(i));
            }
        }
        public object GetValue(int i)
        {
            ICalculatedField fld = GetCalculatedField(i, null);

            if (fld != null)
            {
                return(fld.Value);
            }
            else
            {
                return(BaseReader.GetValue(i));
            }
        }
        public bool IsDBNull(int i)
        {
            ICalculatedField fld = GetCalculatedField(i, null);

            if (fld != null)
            {
                return(fld.Value is DBNull);
            }
            else
            {
                return(BaseReader.IsDBNull(i));
            }
        }
        public string GetName(int i)
        {
            ICalculatedField fld = GetCalculatedField(i, null);

            if (fld != null)
            {
                return(fld.Name);
            }
            else
            {
                return(BaseReader.GetName(i));
            }
        }
        public string GetString(int i)
        {
            ICalculatedField fld = GetCalculatedField(i, typeof(string));

            if (fld != null)
            {
                return((string)fld.Value);
            }
            else
            {
                return(BaseReader.GetString(i));
            }
        }
        public int GetInt32(int i)
        {
            ICalculatedField fld = GetCalculatedField(i, typeof(int));

            if (fld != null)
            {
                return((int)fld.Value);
            }
            else
            {
                return(BaseReader.GetInt32(i));
            }
        }
        public long GetInt64(int i)
        {
            ICalculatedField fld = GetCalculatedField(i, typeof(long));

            if (fld != null)
            {
                return((long)fld.Value);
            }
            else
            {
                return(BaseReader.GetInt64(i));
            }
        }
        public byte GetByte(int i)
        {
            ICalculatedField fld = GetCalculatedField(i, typeof(byte));

            if (fld != null)
            {
                return((byte)fld.Value);
            }
            else
            {
                return(BaseReader.GetByte(i));
            }
        }
        public Guid GetGuid(int i)
        {
            ICalculatedField fld = GetCalculatedField(i, typeof(Guid));

            if (fld != null)
            {
                return((Guid)fld.Value);
            }
            else
            {
                return(BaseReader.GetGuid(i));
            }
        }
        public Type GetFieldType(int i)
        {
            ICalculatedField fld = GetCalculatedField(i, typeof(double));

            if (fld != null)
            {
                return(fld.FieldType);
            }
            else
            {
                return(BaseReader.GetFieldType(i));
            }
        }
        public double GetDouble(int i)
        {
            ICalculatedField fld = GetCalculatedField(i, typeof(double));

            if (fld != null)
            {
                return((double)fld.Value);
            }
            else
            {
                return(BaseReader.GetDouble(i));
            }
        }
        public decimal GetDecimal(int i)
        {
            ICalculatedField fld = GetCalculatedField(i, typeof(decimal));

            if (fld != null)
            {
                return((decimal)fld.Value);
            }
            else
            {
                return(BaseReader.GetDecimal(i));
            }
        }
        public DateTime GetDateTime(int i)
        {
            ICalculatedField fld = GetCalculatedField(i, typeof(DateTime));

            if (fld != null)
            {
                return((DateTime)fld.Value);
            }
            else
            {
                return(BaseReader.GetDateTime(i));
            }
        }
        public string GetDataTypeName(int i)
        {
            ICalculatedField fld = GetCalculatedField(i, null);

            if (fld != null)
            {
                // TODO: Is this correct?
                return(fld.FieldType.Name);
            }
            else
            {
                return(BaseReader.GetDataTypeName(i));
            }
        }
        private ICalculatedField GetCalculatedField(int i, Type ExpectedType)
        {
            if (i < BaseReader.FieldCount)
            {
                return(null);
            }
            i = i - BaseReader.FieldCount;
            if (i > Fields.Length - 1)
            {
                throw new IndexOutOfRangeException();
            }
            ICalculatedField fld = Fields[i];

            if (ExpectedType != null && fld.FieldType != ExpectedType)
            {
                throw new InvalidCastException();
            }
            return(fld);
        }