Geneerinen tarkoittaa yleistä ja ohjelmoinnissa tämä tarkoittaa esim. sitä, että sama luokka tai metodi voi hoitaa tehtävän millä tahansa tietotyypillä. Hyvä esimerkki ovat Kokoelmat. Geneerisessä ohjelmoinninssa käytetään place holdereita eli paikanpitäjiä (usein T, jotka sitten korvataan halutulla tietotyypillä. Place holderit määritellään < ja > -merkkien väliin. Alla esimerkki metodista, joka voi vaihtaa muuttujien arvot keskenään riippumatta niiden tietotyypistä.
public static class Vaihtaja
{
public static void VaihdaArvot<T>(ref T eka, ref T toka)
{
T temp = eka;
eka = toka;
toka = temp;
}
}
int a = 1, b = 2;
// T korvataan tietotyypillä int
Vaihtaja.VaihdaArvot<int>(ref a, ref b);
// koska a:n ja b:n tiedetään olevan int-tyyppiä,
// voi T:n määrittelyn jättää pois
Vaihtaja.VaihdaArvot(ref a, ref b);
string s1 = "World!", s2 = "Hello ";
Vaihtaja.VaihdaArvot(ref s1, ref s2);
Place holdereita voi olla myös useampia ja niille voi antaa omat nimensä. Seuraavassa geneerinen metodi, joka vaihtaa annetun arvon tyypin toiseksi
public static class Vaihtaja
{
public static TTulos VaihdaTyyppia<TAlku, TTulos>(TAlku arvo)
{
return (TTulos)Convert.ChangeType(arvo, typeof(TTulos));
}
}
// string -> int
int luku = Vaihtaja.VaihdaTyyppia<string, int>("123");
// string -> bool
bool tosi = Vaihtaja.VaihdaTyyppia<string, bool>("true");
Myös geneeristen luokkien tekeminen on mahdollista. Tehdään oma kokoelma
public class Jemma<T>
{
List<T> objektit;
public Jemma()
{
objektit = new List<T>();
}
public void Lisaa(T objekti)
{
objektit.Add(objekti);
}
}
Jemma<int> jemma = new Jemma<int>();
jemma.Lisaa(123);