Definição

Muitas vezes encontramos em nossos projetos blocos de códigos que são inevitáveis suas repetições, ocorre muito na criação de CRUDs por exemplo*.* Por isso, seria ótimo se houvesse uma solução “genérica” para esse problema e que os desenvolvedores possam evitar reescrita de código, vale ressaltar que essa prática faz parte de um dos princípios mais fundamentais da programação conhecido como DRY, Don’t Repeat Yourself.

O Generics então significa ser não específico para um determinado tipo de dados, isso permite que você possa definir um método, classe, sctruct ou interface usando o parâmetro de tipo e sem o tipo de dado específico.

Uma classe genérica pode ser uma classe base, bem como uma classe derivada. Seus principais benefícios são

Sintaxe

Um tipo genérico é declarado especificando um parâmetro de tipo entre colchetes angulares <T>. Podemos usar qualquer caractere, mas é bastante comum nomear um tipo genérico como “T”.

NomeTipo<T>, onde **T é o parâmetro de tipo**

Vemos abaixo um exemplo de três implementações genéricas, sendo elas: classes, interfaces e métodos.

public class ClasseGeneric<T> 
{
	// código
}
public InterfaceGeneric<T> 
{
	// código
}
public class ClasseGeneric<**T1, T2**> 
{
	// código
}

Vamos agora para um exemplo prático.

public class ObjetoExemplo<T> 
{
}

No exemplo acima o ObjetoExemplo é o nome da classe e o T é o parâmetro do tipo. Esse parâmetro pode ser usado para os campos, propriedades, tipos de devolução e delegates dentro da classe.

public class ObjetoExemplo<T> 
{
	public T Informacao {get; set;}
	
	public void Exibir()
	{
		Console.Writeline(this.Informacao);
	}
}

Podemos ver acima que a Informacao é uma propriedade presente na classe ObjetoExemplo do tipo T, ou seja, genérica. Então o método Exibir servirá a qualquer tipo de informação.

É possível também definir mais de um tipo genérico em nossa classe.

public class ObjetoExemploComposto<TKey, TValue>
{
    public TKey Chave { get; set; }
    public TValue Valor { get; set; }
    
    public void Exibir()
    {
        Console.WriteLine("Chave: " + Chave + " Valor: " + Valor);
    } 
}

Fazer a instância de uma classe genérica é semelhante a uma classe regular. Mas além disso, o tipo tem que ser especificado.