Extension methods in C#
Inleiding
Methoden kunnen gemakkelijk aan klassen toegevoegd worden en zo is de extension method een uitbreiding van een klasse. Een extension method kan gemakkelijk aan een klasse toegevoegd worden en je hoeft daarbij niet aan de klasse zelf te sleutelen. Je plakt er als het ware wat bij en je kunt het vergelijken met die middeleeuwse balustrade op de uitgelichte afbeelding. Je hangt iets aan die muur en je gaat ervan uit dat die muur dat kan hebben en dat bijzondere voorzieningen verder niet nodig zijn.
We zullen het één ander toelichten aan de hand van de GHB-klasse en de int gegevenstype. De GHB-klasse is eerder ter sprake is gekomen in de post over overriding.
Klasse GHB – Extension Method
De GHB-klasse gebruikt een enum voor de kleuren van de milieusticker. We hebben de kleuren groen tot en met grijs waarbij elke kleur voor een getalwaarde staat. De getalwaarden variëren van 0 (groen) tot en met 5 (grijs):
using System;
public enum Kleur
{ Groen, Paars, Geel, Oranje, Rood, Grijs }
In de desbetreffende console applicatie leggen we een link naar een class library waarin klasse GHB is gedefinieerd zodat de klasse bekend is voor de programmatuur. We maken verder een UitbreidingsNameSpace en in die namespace zetten we een Uitbreidingsklasse waarbij die klasse de uiteindelijke extension methods zal bevatten.
namespace UitbreidingsNameSpace
{
public static class UitbreidingsKlasse
{
// Uitbreidingsmethode GHB-klasse
public static string SpecialeVoorziening(
this GHBclassLibrary.GHB ghb, int maxKleur)
{
string Resultaat =
"- De kleur van de milieusticker is " +
(Kleur)ghb.MilieuSticker + ".\r\n" +
"- " + (Kleur)maxKleur +
" is wat maximaal is toegestaan
in de meeste milieuzones.\r\n";
if (ghb.MilieuSticker > maxKleur)
{
return Resultaat +
"- Dus ja, speciale
voorzieningen zijn nodig.";
}
else
{
return Resultaat + "- Nee, speciale
voorzieningen zijn niet nodig.";
}
}
// Uitbreidingsmethode int
public static bool IsGroterDan(
this int getal, int value)
{
return getal > value;
}
}
}
Uitbreidingsmethode SpecialeVoorziening() krijgt twee parameters mee. De eerste parameter is de klasse waar de methode een uitbreiding van is en dat is te herkennen aan de this key word. In dit geval gaat het om de GHB-klasse die uitgebreid moet worden.
public static string SpecialeVoorziening
(this GHBclassLibrary.GHB ghb, int maxKleur) {...}
De tweede parameter is afhankelijk van de gewenste functionaliteit en is in dit voorbeeld een milieusticker kleur. Het is de kleur milieusticker die een auto minimaal moet hebben om in een milieuzone te mogen komen.
We zien verderop dat we de kleur Rood meegeven als tweede parameter en de kleur rood staat voor enumeratie kleurnummer 4. We vergelijken dit met de kleur van het voertuig en als de auto een grijze milieusticker heeft, dan is de enumeratie kleurnummer van het voertuig 5.
De auto moet minimaal een rode milieusticker kleur hebben of lager om de mileuzone in te mogen en een auto met een grijze milieusticker mag de milieuzone niet in omdat Grijs (5) groter is dan Rood (4). De uitbreidingsmethode retourneert in dat geval de tekst “…Dus ja, speciale voorzieningen zijn nodig…. “.
Klasse int – Extension Method
We willen niet alleen klasse GHB uitbreiden. We willen ook de int gegevenstype uitbreiden met een extension method en dat kunnen we doen omdat de int gegevenstype ook een klasse is. In de Uitbreidingsklasse definiëren we een uitbreidingsmethode voor de int gegevenstype.
public static bool IsGroterDan
(this int getal, int value) {…}
Uitbreidingsmethode IsGroterDan() krijgt ook twee parameters mee. De eerste parameter is de klasse waar de methode een uitbreiding van is (herkenbaar aan de this keyword en dit geval de int). De tweede parameter is afhankelijk van de gewenste functionaliteit en in dit geval geven we een getal mee waarvan we willen weten of iets groter is dan dat getal.
Object
En we instantiëren de objecten en we zien dat we de extension methods ook kunnen aanroepen alsof ze tot de vaste kern van de desbetreffende klasse horen:
namespace Hoofdprogramma
{
using UitbreidingsNameSpace;
class MainClass
{
public static void Main(string[] args)
{
// Uitbreidingsmethode GBH-klasse
Console.WriteLine(
"Voorbeeld extension methods.\r\n");
// Instantieer
GHBclassLibrary.GHB
mijnGHBautomobiel =
new GHBclassLibrary.GHB(
"GHB (GuanggongHunnenburgBetrieb)",
(int)Kleur.Grijs);
// Het object
Console.WriteLine("Ik heb een nieuwe auto.");
Console.WriteLine(
"Het is een {0}.\r\n", mijnGHBautomobiel.Merk);
// De Extension methods
Console.WriteLine(
"Zijn speciale
voorzieningen nodig?\r\n{0}",
mijnGHBautomobiel
.SpecialeVoorziening((int)Kleur.Rood));
// Uitbreidingsmethode int
int getal = 1;
Console.WriteLine(
"\r\nVoorbeeld extension method
van de integer klasse.");
Console.WriteLine(
getal.IsGroterDan(0)
? "Getal " + getal + " is > 0."
: "Getal is " + getal + " <= 0.") ;
}
}
}
Resultaat
En hieronder het resultaat van de extension methods. We zien dat speciale voorzieningen voor de auto nodig zijn. De auto heeft namelijk een te hoge uitstoot aan stikstofoxiden en fijnstof en we zullen daar iets aan moeten doen omdat anders de meeste milieuzones niet toegankelijk zijn voor de auto.
Voorbeeld extension methods.
Ik heb een nieuwe auto.
Het is een GHB (GuanggongHunnenburgBetrieb).
Zijn speciale voorzieningen nodig?
- De kleur van de milieusticker is Grijs.
- Rood is wat maximaal is toegestaan
in de meeste milieuzones.
- Dus ja, speciale voorzieningen zijn nodig.
Voorbeeld extension method van de integer klasse.
Getal 1 is > 0.
Press any key to continue...
Voor de verlaging van de uitstoot zou je normaal kunnen denken aan bijvoorbeeld aanpassingen aan het motormanagement voor een efficiëntere brandstofverbranding en/of aanpassingen aan de roetfilters.
Je kunt ook een voorziening treffen dat de motor management software ervoor zorgt dat de auto alleen maar een gunstige uitstoot geeft bij controle door een keuringsinstantie (sjoemelen 😮 ). Ongetwijfeld een zeer kostenbesparende voorziening, maar imago schade, schadeclaims en kelderende omzetten zullen als autofabrikant je deel zijn als men erachter komt dat de motor management software op die manier is aangepast en de auto bij dagelijks gebruik nog steeds evenveel uitbraakt aan stikstofoxiden en fijnstof.
Slot
In deze post heb ik laten zien hoe we een klasse met extension methods kunnen uitbreiden. Het kan een eigen klasse zijn, maar ook een standaard klasse die out-of-the-box met C# wordt meegeleverd zoals de int gegevenstype.
We hebben gezien dat we voor de extension method niet aan de klasse zelf hoeven te komen. We definiëren de uitbreidingsmethoden en die zetten we bij de desbetreffende klassen alsof het post-it memoblaadjes zijn.
Hopelijk ben je met deze posting weer wat wijzer geworden en ik hoop je weer terug te zien in één van mijn volgende blog posts. Wil je weten wat ik nog meer over C# heb geschreven? Hit the C# button…