Extension methods in C#

  1. Inleiding
  2. Klasse GHB – extension method
  3. Klasse int – extension method
  4. Object
  5. Resultaat
  6. Slot

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.

up | down

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…. “.

up | down

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.

up | down

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.") ;
    }
  }
}

up | down

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.

up | down

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…

up


Laat een reactie achter

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *