Desenvolvimento - C#

Generics na prática

Com a ferramenta lançada pela Microsoft, surgiram também alguns métodos novos e uma nova maneira para criar uma lista de dados...

por Mauricio Junior



Com a ferramenta lançada pela Microsoft, surgiram também alguns métodos novos e uma nova maneira para criar uma lista de dados. 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.4)

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.

Maurício Junior
Mauricio Junior

Mauricio Junior - Formado pela Faculdade Anhanguera, Especialista pela FGV (Fundação Getúlio Vargas), Pós-Graduação em Docência Superior e cursando Mestrado na UNB Engenharia Elétrica; . Tenho 29 anos e possuo sete livros publicados pela editora Ciência Moderna e sou editor do Linha de Código.
Sou Certificado Microsoft MCP, MCAD e MVP, faço parte da comunidade ASPNETI.COM, onde publico artigos, vídeos, ebooks e livros Publico artigos, vídeos e podcast em outras comunidades. Trabalho como Analista de Sistemas / Desenvolvedor na empresa ATP S/A.
Blog:
blog.mauriciojunior.org
Site pessoal: www.mauriciojunior.org