La première chose à dire, est que ces derniers sont une  implémentation du concept de templates qui existait  déjà  en  C++.  Il  est  dorénavant  supporté  par  C#,  C++  et  VB.Net.
Le principe même des Generics est  la généralisation (et/ou réutilisation) de méthode sans ce soucier du typage des paramètres par exemples (transtypage).

Attention,  les  Generics  ne  sont  pas  identiques  aux  templates  du  C++,  ils  ont  encore  un  certain nombre de limitations:
-  il  n’est  pas  possible  d’utiliser  des  opérateur  arithmétiques  mais  on  peut  utiliser  des opérateurs personnels

-  les  paramètres  génériques  ne  peuvent  avoir  de  valeur  par  défaut

-  d’autres  limitations  dont  l’utilisation  très  rare  ne mérite  pas  de  se  pencher  dessus  pour  le moment

Cela paraîtra sûrement plus clair à l’aide d’un exemple concret:

static void Main(string[] args)
{
int a = 1, b = 5, c = 3;
List<int> myIntegerList = new List<int>();
myIntegerList.Add(a);
myIntegerList.Add(b);
myIntegerList.Add(c);
foreach(int val in list)
{
total = total + val;
}
}

Sans entrer dans les détails, nous verrons comment utiliser ce que l’on appelle une “Type-safe generic List”, une List (collection) dont le type est sûr. En effet, une List peut, de base accepter des objets de type différents qui sont alors “boxés” (rangés sans être castés dans un type différent), ainsi lors de la récupération des “items” de la List, nous ne savons pas le type de ces derniers et le unboxing peut entrainer des erreurs d’exécution. Ici, nous “créons” une collection ne contenant que des objets du type Integer, et l’opération de boxing/unboxing n’a plus lieu d’être. Les opérations sur cette collection sont alors plus “sécurisées”.

Bien sûr, il est possible de tirer avantage des Generics pour créer des classes réutilisables. En voici un exemple:

using System;
using System.Collections.Generic;
using System.Text;

namespace Developper
{
public class ClasseDemo< Type1, Type2 >
{
private Type1 _obj;
public ClasseDemo(KeyType obj1)
{
// constructeur
_obj = obj1;
}

public Type2 Method(Type2 obj1, Type2 obj2)
{
// Code fonctionnel
}
}
}

Ce bout de code est un peu spécial, mais je tenais à montrer la possiblité d’utiliser plusieurs paramètres génériques pour une seule et même classe. Cette dernière prend donc deux paramètres, l’un étant utilisé dans son constructeur, l’autre compare deux objets et retourne par exemple l’un des deux selon une certaine comparaison.

Ainsi, vous savez maintenant que les Generics et leurs nombreuses utilisations vous permettront de réduire la taille de votre code et de faire des classes, méthodes réutilisables à volonté.

Source : developpez.com