Gewusst wie: Implementieren und Aufrufen einer benutzerdefinierten Erweiterungsmethode (C#-Programmierhandbuch)

Aktualisiert: November 2007

Dieses Thema zeigt, wie Sie Ihre eigenen Erweiterungsmethoden für einen beliebigen Typ in der .NET Framework-Klassenbibliothek oder einen beliebigen anderen .NET-Typ, den Sie erweitern möchten, implementieren können. Der Clientcode kann Ihre Erweiterungsmethoden verwenden, indem ein Verweis auf die DLL, die die Methoden enthält, sowie eine using-Direktive, die den Namespace festlegt, in der die Erweiterungsmethoden definiert sind, hinzugefügt werden.

Definieren und Aufrufen der Erweiterungsmethode

  1. Definieren Sie eine statische Klasse, die die Erweiterungsmethode enthalten soll.

    Die Klasse muss für den Clientcode sichtbar sein. Weitere Informationen über Zugriffsregeln finden Sie unter Zugriffsmodifizierer (C#-Programmierhandbuch).

  2. Implementieren Sie die Erweiterungsmethode als statische Methode mit mindestens den gleichen Sichtbarkeitseinstellungen wie die enthaltende Klasse.

  3. Der erste Parameter der Methode bestimmt den Typ, für den die Methode gilt, und vor dem Parameter steht der this-Modifizierer.

  4. Fügen Sie im Aufrufcode eine using-Direktive hinzu, um den Namespace festzulegen, der die Erweiterungsmethodenklasse enthält.

  5. Rufen Sie die Methoden auf, als ob sie Instanzmethoden für den Typ wären.

    Beachten Sie, dass der erste Parameter nicht durch den Aufruf von Code festgelegt wird, da er den Typ darstellt, auf den der Operator angewendet wird, und der Compiler kennt bereits den Typ Ihres Objekts. Sie müssen nur Argumente für Parameter 2 bis n angeben.

Beispiel

Im folgenden Beispiel wird eine Erweiterungsmethode mit dem Namen WordCount in der MyExtensions.StringExtension-Klasse implementiert. Die Methode gilt für die String-Klasse, die als erster Methodenparameter angegeben wird. Der MyExtensions-Namespace wird in den Anwendungs-Namespace importiert, und die Methode wird in der Main-Methode aufgerufen.

using System.Linq;
using System.Text;
using System;

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

Kompilieren des Codes

Um diesen Code auszuführen, kopieren Sie ihn, und fügen Sie ihn in ein Visual C#-Konsolenanwendungsprojekt ein, das in Visual Studio erstellt wurde. Dieses Projekt gilt standardmäßig für .NET Framework Version 3.5 und hat einen Verweis auf System.Core.dll sowie eine using-Direktive für System.Linq. Wenn eine oder mehrere dieser Anforderungen im Projekt fehlen, können Sie sie manuell hinzufügen. Weitere Informationen hierzu finden Sie unter Gewusst wie: Erstellen eines LINQ-Projekts.

Sicherheit

Erweiterungsmethoden stellen keine speziellen Sicherheitslücken dar. Sie können niemals verwendet werden, um als vorhandene Methoden auf einem Typ zu agieren, da alle Namenskonflikte zugunsten der Instanz oder der statischen Methode, die vom Typ selbst definiert wird, gelöst werden. Erweiterungsmethoden können nicht auf private Daten in der erweiterten Klasse zugreifen.

Siehe auch

Konzepte

C#-Programmierhandbuch

Referenz

Erweiterungsmethoden (C#-Programmierhandbuch)

Statische Klassen und statische Klassenmember (C#-Programmierhandbuch)

protected (C#-Referenz)

internal (C#-Referenz)

public (C#-Referenz)

this (C#-Referenz)

namespace (C#-Referenz)

Weitere Ressourcen

Sprachintegrierte Abfrage (Language-Integrated Query, LINQ)