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 { // 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
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 { 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.
MaurĂcio Junior