Een aangepaste extensiemethode implementeren en aanroepen (C#-programmeerhandleiding)

In dit onderwerp wordt beschreven hoe u uw eigen extensiemethoden voor elk .NET-type implementeert. Clientcode kan uw extensiemethoden gebruiken door een verwijzing toe te voegen naar het DLL-bestand dat deze bevat en een using-instructie toe te voegen waarmee de naamruimte wordt opgegeven waarin de extensiemethoden worden gedefinieerd.

De extensiemethode definiëren en aanroepen

  1. Definieer een statische klasse die de extensiemethode bevat.

    De klasse moet zichtbaar zijn voor clientcode. Zie Access Modifiers voor meer informatie over toegankelijkheidsregels.

  2. Implementeer de extensiemethode als een statische methode met ten minste dezelfde zichtbaarheid als de bijbehorende klasse.

  3. De eerste parameter van de methode specificeert het type waarop de methode werkt; deze moet worden voorafgegaan door de wijzigingsfunctie .

  4. Voeg in de aanroepende code een using instructie toe om de naamruimte op te geven die de klasse extensiemethode bevat.

  5. Roep de methoden aan alsof het exemplaarmethoden voor het type zijn.

    Houd er rekening mee dat de eerste parameter niet wordt opgegeven door code aan te roepen, omdat deze het type aangeeft waarop de operator wordt toegepast en dat de compiler al het type van uw object kent. U hoeft alleen argumenten op te geven voor parameters 2 tot nen met .

Opmerking

In het volgende voorbeeld wordt een extensiemethode geïmplementeerd met de naam WordCount in de CustomExtensions.StringExtension klasse. De methode werkt op de String klasse, die is opgegeven als de eerste methodeparameter. De CustomExtensions naamruimte wordt geïmporteerd in de naamruimte van de toepassing en de methode wordt binnen de Main methode aangeroepen.

namespace CustomExtensions
{
    // Extension methods must be defined in a static class.
    public static class StringExtension
    {
        // This is the extension method.
        // The first parameter takes the "this" modifier
        // and specifies the type for which the method is defined.
        public static int WordCount(this string str)
        {
            return str.Split(new char[] {' ', '.','?'}, StringSplitOptions.RemoveEmptyEntries).Length;
        }
    }
}
namespace Extension_Methods_Simple
{
    // Import the extension method namespace.
    using CustomExtensions;
    class Program
    {
        static void Main(string[] args)
        {
            string s = "The quick brown fox jumped over the lazy dog.";
            // Call the method as if it were an
            // instance method on the type. Note that the first
            // parameter is not specified by the calling code.
            int i = s.WordCount();
            System.Console.WriteLine("Word count of s is {0}", i);
        }
    }
}

.NET-beveiliging

Extensiemethoden bieden geen specifieke beveiligingsproblemen. Ze kunnen nooit worden gebruikt om bestaande methoden voor een type te imiteren, omdat alle naamconflicten worden opgelost ten gunste van het exemplaar of de statische methode die is gedefinieerd door het type zelf. Extensiemethoden hebben geen toegang tot persoonlijke gegevens in de uitgebreide klasse.

Zie ook