Linq : extension methods

  1. Wat zijn extension methods?
  2. Eenvoudig voorbeeld
  3. Uitgebreider voorbeeld
  4. Linq extension methods voor objecten
  5. Linq extension methods voor XML
  6. Linq extension methods voor databases

Wat zijn extension methods?

Extension methods staan ons toe om methoden toe te voegen aan bestaande klassen, zonder deze klassen te moeten subklassen of hercompileren.
Deze extension methods worden intensief gebruikt in LINQ, maar kunnen ook los van LINQ gebruikt worden.

Eenvoudig voorbeeld

Heb je al eens een controle uitgevoerd op de geldigheid van een door de gebruiker ingegeven emailadres?
Tot op heden deed je dat wellicht als volgt:
string email = Request.QueryString["email"];

if ( EmailValidator.IsValid(email) ) {
   
}
Je spreekt dus je afzonderlijke klasse EmailValidator aan die statische methode bevat IsValid.
Door extension methods te gebruiken kan je ervoor zorgen dat een variabele van het type string een methode IsValidEmailAddress heeft:
string email = Request.QueryString["email"];

if ( email.IsValidEmailAddress() ) {
   
}

Hiervoor maak je een extension method voor de klasse string:

namespace MyExtensions
{
	public static class MyExtensionClass
	{
		public static bool IsValidEmailAddress(this string s)
		{
			Regex regex = new Regex(@"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$");
			return regex.IsMatch(s);
		}
	}
}

Het sleutelwoord this in de methode vertelt de compiler dat deze methode een extension method is voor het type dat volgt, hier dus het type string.
Werk je in dezelfde namespace als je project-file, dan is de extension-methode direct te gebruiken.

Bevindt de extension method zich in een aparte class-library en namespace, dan doe je twee zaken:

Uitgebreider voorbeeld

Als je een extension method maakt voor een superklasse, dan is deze ook bruikbaar in afgeleide klassen.

Het ultieme voorbeeld hiervoor kunnen we maken door een extension method te maken voor een object.

public static class MyExtensionClass
{

	public static bool In(this object o, IEnumerable c)
	{
		foreach (object i in c)
		{
			if (i.Equals(o)) 
				return true;
		}
		return false;
	}
}

Deze klasse kan dus voor elk object kijken of het voorkomt in een reeks van elementen die de interface IEnumerable implementeert, zoals collecties.

De methode In heeft nu natuurlijk tal van toepassingsmogelijkheden:

Linq extension methods voor objecten

In de namespace System.Linq vinden we de klasse Queryable met een uitgebreid arsenaal aan extension methods om binnen .Net data te bevragen.

Veel van deze methoden worden verderop in de cursus uitgebreider besproken, maar hier volgt al een eerste kennismaking.

Where

Average, Max

Linq extension methods voor XML

Average, Max

double gemiddeldeLeeftdijd = people.Descendants("person").Average(p => Convert.ToInt32(p.Attribute("age").Value));
int hoogsteLeeftijd = people.Descendants("person").Max(p => Convert.ToInt32(p.Attribute("age").Value));

Linq extension methods voor databases

Meer tutorials:
leer ook: html | xhtml | css | asp | asp.net | c# | ado.net | linq | ajax | java | javascript
Valid HTML 4.01! Valid CSS! © - Cursusweb