Dev (Back & Front)ARTIGO

Generics na prática

Com o Visual Studio .NET 2005 e 2008, ferramentas
lançadas pela Microsoft, surgiram 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 design de classes e
métodos, com 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

O uso do 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 lista 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<br /><br />using System.Collections.Generics<br /><br /><br /><br />class TesteList<br /><br />{<br /><br />    static void Main()<br /><br />    {<br /><br />        // int is the type argument<br /><br />        GenericList<int> lista = new GenericList<int>();<br /><br /><br /><br />        for (int x = 0; x < 10; x++)<br /><br />        {<br /><br />            lista.AddHead(x);<br /><br />        }<br /><br /><br /><br />        foreach (int i in lista)<br /><br />        {<br /><br />            System.Console.Write(i + " ");<br /><br />        }<br /><br />        System.Console.WriteLine("\nDone");<br /><br />    }<br /><br />}

Referência:
Generics.1.1

O 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 preenchê-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;<br />  private string _nome;<br />  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.3

A referência
Generics.1.4 mostra o código gerado na classe Usuario.cs.

 public string Email<br /><br />    {<br /><br />        get { return _email; }<br /><br />        set { _email = value; }<br /><br />    }<br /><br /><br /><br />    public string Nome<br /><br />    {<br /><br />        get { return _nome; }<br /><br />        set { _nome = value; }<br /><br />    }<br /><br /><br /><br />    public int Chave<br /><br />    {<br /><br />        get { return _chave; }<br /><br />        set { _chave = value; }<br /><br />    }

Referência:
Generics.1.4

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.5).

 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Generics.aspx.cs" Inherits="Generics" %><br /><br /><br /><br /><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><br /><br /><br /><br /><html xmlns="http://www.w3.org/1999/xhtml" ><br /><br /><head runat="server"><br /><br />    <title>Generics</title><br /><br /></head><br /><br /><body><br /><br />    <form id="form1" runat="server"><br /><br />    <div><br /><br />        <asp:GridView ID="gridView" runat="server"><br /><br /><br /><br />        </asp:GridView><br /><br />    </div><br /><br />    </form><br /><br /></body><br /><br /></html>

Referência:
Generics.1.5

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.6):

 private List<Usuario>  getUsuario()<br /><br />    {<br /><br />        using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["conn"].ConnectionString))<br /><br />        {<br /><br />            using (SqlCommand command = new SqlCommand("select chave, nome, email from tb001_usuario", conn))<br /><br />            {<br /><br />                conn.Open();<br /><br />                List<Usuario> listUsu = new List<Usuario>();<br /><br />                using (SqlDataReader dr = command.ExecuteReader())<br /><br />                {<br /><br />                    while (dr.Read())<br /><br />                    {<br /><br />                        Usuario usuario = new Usuario();<br /><br />                        usuario.Chave = (int)dr["chave"];<br /><br />                        usuario.Nome = (string)dr["nome"];<br /><br />                        usuario.Email = (string)dr["email"];<br /><br />                        listUsu.Add(usuario);<br /><br />                    }<br /><br />                }<br /><br />                return listUsu;<br /><br />            }<br /><br />        }<br /><br />    } 

Referência:
Generics.1.6

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();<br /><br />   usuario.Chave = (int)dr["chave"];<br /><br />   usuario.Nome = (string)dr["nome"];<br /><br />   usuario.Email = (string)dr["email"];

Referência: Generics.1.7

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())<br /><br />                    {<br /><br />                        Usuario usuario = new Usuario();<br /><br />                        usuario.Chave = (int)dr["chave"];<br /><br />                        usuario.Nome = (string)dr["nome"];<br /><br />                        usuario.Email = (string)dr["email"];<br /><br />                        listUsu.Add(usuario);<br /><br />                    }

Referência:
Generics.1.8

Ao fim de tudo,
retorno a lista preenchida.

return listUsu;

Referência:
Generics.1.9

No método
Page_Load, atribuí 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.10)

 using System;<br /><br />using System.Data;<br /><br />using System.Configuration;<br /><br />using System.Collections;<br /><br />using System.Web;<br /><br />using System.Web.Security;<br /><br />using System.Web.UI;<br /><br />using System.Web.UI.WebControls;<br /><br />using System.Web.UI.WebControls.WebParts;<br /><br />using System.Web.UI.HtmlControls;<br /><br />using System.Data.SqlClient;<br /><br /><br /><br />//importes<br /><br />using System.Collections.Generic;<br /><br /><br /><br />public partial class Generics : System.Web.UI.Page<br /><br />{<br /><br />    protected void Page_Load(object sender, EventArgs e)<br /><br />    {<br /><br />        this.gridView.DataSource = getUsuario();<br /><br />        this.gridView.DataBind();<br /><br />    }<br /><br /><br /><br />    private List<Usuario> getUsuario()<br /><br />    {<br /><br />        using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["conn"].ConnectionString))<br /><br />        {<br /><br />            using (SqlCommand command = new SqlCommand("select chave, nome, email from tb001_usuario", conn))<br /><br />            {<br /><br />                conn.Open();<br /><br />                List<Usuario> listUsu = new List<Usuario>();<br /><br />                using (SqlDataReader dr = command.ExecuteReader())<br /><br />                {<br /><br />                    while (dr.Read())<br /><br />                    {<br /><br />                        Usuario usuario = new Usuario();<br /><br />                        usuario.Chave = (int)dr["chave"];<br /><br />                        usuario.Nome = (string)dr["nome"];<br /><br />                        usuario.Email = (string)dr["email"];<br /><br />                        listUsu.Add(usuario);<br /><br />                    }<br /><br />                }<br /><br />                return listUsu;<br /><br />            }<br /><br />        }<br /><br />    }<br /><br />}

Referência:
Generics.1.10

A única
especificação não mostrada foi o banco de dados. Segue (Referência
Generics.1.11):

 

Referência:
Generics.1.11

Resultado final

Referência:
Generics.1.13

Bom, fico por
aqui, espero que tenha gostado e aprendido um pouco.  Qualquer dúvida, é só comentar ou enviar email.

Com mais de 20 anos trabalhando no mercado de tecnologia. Mestre em Engenharia Elétrica voltada para o mundo mobile, com mais de 20 livros publicados e cerca de 700 artigos publicados com intuito de ajudar àqueles que querem aprender a programar (site, software, desktop, serviços, api e mobile). Site pessoal: https://www.mauriciojunior.net - MVP, MCAD, MCP Microsoft

Ver perfil