Gewusst wie: Implementieren und Aufrufen einer benutzerdefinierten Erweiterungsmethode (C#-Programmierhandbuch)How to: Implement and Call a Custom Extension Method (C# Programming Guide)

In diesem Thema wird gezeigt, wie eigene Erweiterungsmethoden für jeden Typ in der .NET Framework-Klassenbibliothek oder beliebigen anderen .NET-Typen implementiert werden.This topic shows how to implement your own extension methods for any type in the .NET Framework Class Library, or any other .NET type that you want to extend. Der Clientcode kann Ihre Erweiterungsmethoden verwenden, wenn ein Verweis auf die DLL, die die Methoden enthält, und eine using-Direktive hinzugefügt werden, die den Namespace angibt, in dem die Erweiterungsmethoden definiert sind.Client code can use your extension methods by adding a reference to the DLL that contains them, and adding a using directive that specifies the namespace in which the extension methods are defined.

So definieren Sie die Erweiterungsmethode und rufen Sie aufTo define and call the extension method

  1. Definieren Sie eine statische Klasse, die die Erweiterungsmethode enthalten soll.Define a static class to contain the extension method.

    Die Klasse muss für den Clientcode sichtbar sein.The class must be visible to client code. Weitere Informationen finden Sie unter Zugriffsmodifizierer.For more information about accessibility rules, see Access Modifiers.

  2. Implementieren Sie die Erweiterungsmethode als statische Methode mit mindestens die gleichen Sichtbarkeit wie die enthaltende Klasse.Implement the extension method as a static method with at least the same visibility as the containing class.

  3. Der erste Parameter der Methode gibt den Typ an, auf den die Methode angewendet wird. Ihm muss ein this-Modifizierer vorangehen.The first parameter of the method specifies the type that the method operates on; it must be preceded with the this modifier.

  4. Fügen Sie im aufrufenden Code eine using-Direktive hinzu, um den Namespace anzugeben, der die Erweiterungsklassemethode enthält.In the calling code, add a using directive to specify the namespace that contains the extension method class.

  5. Rufen Sie die Methoden auf, als wären sie Instanzmethoden für den Typ.Call the methods as if they were instance methods on the type.

    Beachten Sie, dass der erste Parameter nicht durch einen Aufruf von Code angegeben wird, da er den Typ darstellt, auf den der Operator angewendet wird, und der Compiler bereits den Typ des Objekts kennt.Note that the first parameter is not specified by calling code because it represents the type on which the operator is being applied, and the compiler already knows the type of your object. Sie müssen nur Argumente für Parameter 2 bis n bereitstellen.You only have to provide arguments for parameters 2 through n.

BeispielExample

Im folgenden Beispiel wird eine Erweiterungsmethode namens WordCount in der CustomExtensions.StringExtension-Klasse implementiert.The following example implements an extension method named WordCount in the CustomExtensions.StringExtension class. Die Methode wird auf die String-Klasse angewendet, die als erster Methodenparameter angegeben wird.The method operates on the String class, which is specified as the first method parameter. Der CustomExtensions-Namespace wird in den Anwendungsnamespace importiert, und die Methode wird in der Main-Methode aufgerufen.The CustomExtensions namespace is imported into the application namespace, and the method is called inside the Main method.

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 CodesCompiling the Code

Um diesen Code auszuführen, kopieren Sie ihn, und fügen Sie ihn in ein Visual C#-Konsolenanwendungsprojekt ein, das in Visual StudioVisual Studio erstellt wurde.To run this code, copy and paste it into a Visual C# console application project that has been created in Visual StudioVisual Studio. Standardmäßig wird dieses Projekt mit Version 3.5 von .NET Framework.NET Framework verwendet und verfügt über einen Verweis auf „System.Core.dll“ und eine using-Anweisung für „System.Linq“.By default, this project targets version 3.5 of the .NET Framework.NET Framework, and it has a reference to System.Core.dll and a using directive for System.Linq. Wenn mindestens eine dieser Anforderungen im Projekt nicht vorhanden sind, können Sie sie manuell hinzufügen.If one or more of these requirements are missing from the project, you can add them manually.

.NET Framework-Sicherheit.NET Framework Security

Erweiterungsmethoden enthalten keine speziellen Sicherheitslücken.Extension methods present no specific security vulnerabilities. Sie können nicht dazu verwendet werden, die Identität vorhandener Methoden für einen Typ anzunehmen, da alle Namenskonflikte zugunsten der Instanz oder eine statische Methode gelöst werden, die der Typ selbst definiert.They can never be used to impersonate existing methods on a type, because all name collisions are resolved in favor of the instance or static method defined by the type itself. Erweiterungsmethoden können in der erweiterten Klasse nicht auf private Daten zugreifen.Extension methods cannot access any private data in the extended class.

Siehe auchSee Also

C#-ProgrammierhandbuchC# Programming Guide
ErweiterungsmethodenExtension Methods
LINQ (Language Integrated Query)LINQ (Language-Integrated Query)
Statische Klassen und statische KlassenmemberStatic Classes and Static Class Members
protectedprotected
internalinternal
publicpublic
thisthis
namespacenamespace