/// <summary>
        /// Pesquisa por um utilizador
        /// </summary>
        /// <param name="atributo">Nome do atributo</param>
        /// <param name="operador">Operador a aplicar</param>
        /// <param name="valor">Valor do atributo</param>
        /// <returns>Todas as instancias que coorespondam à condição</returns>
        public static List <Utilizador> Where(string atributo, string operador, object valor)
        {
            List <Utilizador> users = new List <Utilizador>();
            DBConnection      db    = new DBConnection();
            DataTable         table;

            int            id;
            string         email, nome, nif, telemovel;
            DateTime       dataNascimento;
            TipoUtilizador tipo;

            table = db.Query("SELECT * FROM utilizador WHERE " + atributo + " " + operador + " @0", valor);

            if (table == null)
            {
                return(users);
            }

            //Percorrer todas as linhas retornadas da base de dados
            foreach (DataRow row in table.Rows)
            {
                id             = row.Field <int>("id");
                email          = row.Field <string>("email");
                nome           = row.Field <string>("nome");
                nif            = row.Field <string>("nif");
                telemovel      = row.Field <string>("telemovel");
                dataNascimento = row.Field <DateTime>("data_nascimento");
                tipo           = TiposUtilizador.GetById(row.Field <int>("tipo_utilizador_id"));

                users.Add(new Utilizador(id, nome, nif, email, dataNascimento, telemovel, tipo));
            }

            return(users);
        }
        /// <summary>
        /// Procura um utilizador pelo id
        /// </summary>
        /// <param name="id">ID a procurar</param>
        /// <returns>Instancia de utilizador coorespondente ou null se nao existir</returns>
        public static Utilizador GetById(int id)
        {
            DBConnection db;
            Utilizador   utilizador = utilizadores.FindLast(x => x.Id == id);
            DataTable    table;

            string         email, nome, nif, telemovel;
            DateTime       dataNascimento;
            TipoUtilizador tipo;

            //1º tenta ver se ja tem esse tipo em memoria
            if (utilizador != null)
            {
                return(utilizador);
            }

            //Caso nao tenha esse tipo em memoria vai à base de dados
            db    = new DBConnection();
            table = db.Query("SELECT * FROM utilizador WHERE id = @0", id);

            //Se o id não existir também na base de dados retorna objeto default
            if (table.Rows.Count == 0)
            {
                return(utilizador);
            }

            //criar variaveis necessarias par ao objeto de utilizador
            email          = table.Rows[0].Field <string>("email");
            nome           = table.Rows[0].Field <string>("nome");
            nif            = table.Rows[0].Field <string>("nif");
            telemovel      = table.Rows[0].Field <string>("telemovel");
            dataNascimento = table.Rows[0].Field <DateTime>("data_nascimento");
            tipo           = TiposUtilizador.GetById(table.Rows[0].Field <int>("tipo_utilizador_id"));

            //Criar novo objeto de Utilizador
            utilizador = new Utilizador(id, nome, nif, email, dataNascimento, telemovel, tipo);
            utilizadores.Add(utilizador);
            return(utilizador);
        }