Com a ferramenta lançada pela Microsoft, surgiram tambĂ©m alguns mĂ©todos novos e uma nova maneira para criar uma lista de dados. NĂłs chamamos de Generics. Generics Ă© uma caracterĂ­stica na versĂŁo do framework . NET 2.0 dentro do runtime CLR, com o conceito de parĂąmetros no qual cria a possibilidade de designer classes e mĂ©todos. A especificação de um ou mais tipos, atĂ© classe ou mĂ©todo que for declarado e instanciado pelo cĂłdigo do cliente. Por exemplo, usando um genĂ©rico do tipo parĂąmetros T, vocĂȘ pode escrever uma simples classe que outros cĂłdigos clientes possam utilizar sem gerar custo ou risco do runtime casts ou operaçÔes boxing.

 

ColeçÔes

 

Com o Generics abre a possibilidade de trabalhar com coleçÔes e realmente utilizar orientação a objetos. Sistema orientado a objetos é muito mais do que apenas classes e métodos. O namespace que preciso importar ao meu projeto é a System.Collections.Generics. O .NET 2.0 veio para resolver os problemas anteriores em relação a coleçÔes.

 

 

Na prĂĄtica

 

O cĂłdigo (referĂȘncia generics.1.1) Ă© um exemplo que mostra como gerar uma classe generic GenericList<T> que contĂ©m uma listas de inteiros. Simplesmente mudando o tipo de argumento, o cĂłdigo da referĂȘncia (generics.1.1) poderĂĄ ser facilmente modificado para criar listas de strings ou vĂĄrias outros tipos customizados.

 

 

 

//importes

using System.Collections.Generics

 

class TesteList

{

    static void Main()

    {

        // int is the type argument

        GenericList<int> lista = new GenericList<int>();

 

        for (int x = 0; x < 10; x++)

        {

            lista.AddHead(x);

        }

 

        foreach (int i in lista)

        {

            System.Console.Write(i + " ");

        }

        System.Console.WriteLine("\nDone");

    }

}

ReferĂȘncia: Generics.1.1

 

No exemplo, mostra claramente uma lista sendo preenchida e mais abaixo escrita no console. Uma lista pode ser fortemente “tipada” de acordo com a sua classe gerada, ou seja, no sistema possui uma classe do tipo “Usuario", pode ser feito uma lista desse tipo e preenchido de uma forma fácil, rápida e prática.

 

O próximo exemplo gerará uma lista do tipo “Usuario”, logo após pegar os dados do banco e preenche-la.

 

Seguindo, cliquei com o botĂŁo direito em cima do projeto e adicionei um nova classe com o nome Usuario.cs. Gerei trĂȘs propriedades, uma do tipo int e o restante string. (ReferĂȘncia: Generics.1.2)

 

 

 

 

    private int _chave;

    private string _nome;

    private string _email;

 

ReferĂȘncia: Generics.1.2

 

Depois de gerar as propriedades, utilizei a tela de atalho CTRL + R em seguida CTRL + E, essas teclas de atalho servem para gerar Get e Set das propriedades.

Caso nĂŁo queira usar as teclas de atalho, basta utilizar o menu Refactor e escolher a opção Encapsulate Field... (ReferĂȘncia Generics.1.3)

 

 

ReferĂȘncia: Generics.1.4

 

 

A referĂȘncia Generics.1.5 mostra o cĂłdigo gerado na classe Usuario.cs.

 

 

    public string Email

    {

        get { return _email; }

        set { _email = value; }

    }

 

    public string Nome

    {

        get { return _nome; }

        set { _nome = value; }

    }

 

    public int Chave

    {

        get { return _chave; }

        set { _chave = value; }

    }

 

ReferĂȘncia: Generics.1.5

 

 

Mostrarei um exemplo bĂĄsico conectando no banco de dados e preenchendo a lista do tipo Usuario. Gerei uma pĂĄgina .ASPX com o nome Generics.aspx. Na parte HTML, adicionei um componente GridView com o nome gridView. (ReferĂȘncia Generics.1.6)

 

 

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Generics.aspx.cs" Inherits="Generics" %>

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

 

<html xmlns="http://www.w3.org/1999/xhtml" >

<head runat="server">

    <title>Generics</title>

</head>

<body>

    <form id="form1" runat="server">

    <div>

        <asp:GridView ID="gridView" runat="server">

           

        </asp:GridView>

    </div>

    </form>

</body>

</html>

 

ReferĂȘncia: Generics.1.6

NĂŁo acrescentei nada dentro do gridview criado anteriormente. Passando para o cĂłdigo Generics.aspx.cs, criei o mĂ©todo getUsuario() que retorna uma lista de usuĂĄrios. Criei a conexĂŁo, fiz o select, abri o banco de dados com o comando Open(). Criei uma lista de usuĂĄrio, executei o ExecuteReader(), adicionei a um while o datareader criado e por final fui adicionando na lista. Depois que adicionei na lista retornei-a. Veja o cĂłdigo. (ReferĂȘncia Generics.1.7)

 

 

 

private List<Usuario> getUsuario()

    {

        using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["conn"].ConnectionString))

        {

            using (SqlCommand command = new SqlCommand("select chave, nome, email from tb001_usuario", conn))

            {

                conn.Open();

                List<Usuario> listUsu = new List<Usuario>();

                using (SqlDataReader dr = command.ExecuteReader())

                {

                    while (dr.Read())

                    {

                        Usuario usuario = new Usuario();

                        usuario.Chave = (int)dr["chave"];

                        usuario.Nome = (string)dr["nome"];

                        usuario.Email = (string)dr["email"];

                        listUsu.Add(usuario);

                    }

                }

                return listUsu;

            }

        }

    }

ReferĂȘncia: Generics.1.7

 

 

 

Explicação:

 

Note que depois de abrir o banco de dados, gerei um List<Usuario>. Esse <Usuario> Ă© o nome de minha classe, ou seja, estou “tipando” a minha lista para o tipo da classe Usuario.cs que possui apenas propriedades get e set.

Executei o comando ExecuteReader() e logo abaixo criei um laço enquanto a variável “DataReader” tiver dados.

 

Dentro do “while”, criei uma nova variável da classe “Usuario” criada anteriormente e fui adicionando o valor do “DataReader” dentro da variável criada Usuario com suas respectivas propriedades.

 

 

 

   Usuario usuario = new Usuario();

   usuario.Chave = (int)dr["chave"];

   usuario.Nome = (string)dr["nome"];

   usuario.Email = (string)dr["email"];

 

ReferĂȘncia: Generics.1.8

 

 

No fim do while pego a lista e uso o “Add” passando o “usuario”. Dessa forma, os valores são adicionados na lista.

 

 

                   while (dr.Read())

                    {

                        Usuario usuario = new Usuario();

                        usuario.Chave = (int)dr["chave"];

                        usuario.Nome = (string)dr["nome"];

                        usuario.Email = (string)dr["email"];

                        listUsu.Add(usuario);

                    }

ReferĂȘncia: Generics.1.9

 

Ao fim de tudo, retorno a lista preenchida.

 

return listUsu;

 

ReferĂȘncia: Generics.1.10

 

 

No mĂ©todo Page_Load, atribui o resultado do mĂ©todo ao DataSource do gridview, em seguida usei o DataBind(). Para nĂŁo confundir, segue o cĂłdigo de toda pĂĄgina .cs. (ReferĂȘncia Generics.1.11)

 

 

using System;

using System.Data;

using System.Configuration;

using System.Collections;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

using System.Data.SqlClient;

 

//importes

using System.Collections.Generic;

 

public partial class Generics : System.Web.UI.Page

{

    protected void Page_Load(object sender, EventArgs e)

    {

        this.gridView.DataSource = getUsuario();

        this.gridView.DataBind();

    }

 

    private List<Usuario> getUsuario()

    {

        using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["conn"].ConnectionString))

        {

            using (SqlCommand command = new SqlCommand("select chave, nome, email from tb001_usuario", conn))

            {

                conn.Open();

                List<Usuario> listUsu = new List<Usuario>();

                using (SqlDataReader dr = command.ExecuteReader())

                {

                    while (dr.Read())

                    {

                        Usuario usuario = new Usuario();

                        usuario.Chave = (int)dr["chave"];

                        usuario.Nome = (string)dr["nome"];

                        usuario.Email = (string)dr["email"];

                        listUsu.Add(usuario);

                    }

                }

                return listUsu;

            }

        }

    }

}

 

ReferĂȘncia: Generics.1.11

 

 

A Ășnica especificação nĂŁo mostrada foi o banco de dados. Segue. (ReferĂȘncia Generics.1.12).

 

 

ReferĂȘncia: Generics.1.12

 

 

Resultado final. (ReferĂȘncia Generics.1.13)

 

 

ReferĂȘncia: Generics.1.14

 

 

Bom, fico por aqui, espero que tenha gostado e aprendido um pouco.  Qualquer dĂșvida, favor entrar em contato pelo e-mail mauricio@aspneti.com.

 

 

Livros publicados:

 

 

 

MaurĂ­cio Junior

www.aspneti.com

www.mauriciojunior.org