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

In diesem Artikel wird das Implementieren Ihrer eigenen Erweiterungsmethoden für jeden .NET-Typ behandelt. 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.

So definieren Sie die Erweiterungsmethode und rufen Sie auf

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

    Die Klasse muss für den Clientcode sichtbar sein. Weitere Informationen finden Sie unter Zugriffsmodifizierer.

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

  3. Der erste Parameter der Methode gibt den Typ an, auf den die Methode angewendet wird. Ihm muss ein this-Modifizierer vorangehen.

  4. Fügen Sie im aufrufenden Code eine using-Direktive hinzu, um den Namespace anzugeben, der die Erweiterungsklassemethode enthält.

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

    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. Sie müssen nur Argumente für Parameter 2 bis n bereitstellen.

Beispiel

Im folgenden Beispiel wird eine Erweiterungsmethode namens WordCount in der CustomExtensions.StringExtension-Klasse implementiert. Die Methode wird auf die String-Klasse angewendet, die als erster Methodenparameter angegeben wird. Der CustomExtensions-Namespace wird in den Anwendungsnamespace importiert, und die Methode wird in der Main-Methode aufgerufen.

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-Sicherheit

Erweiterungsmethoden enthalten keine speziellen Sicherheitslücken. 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. Erweiterungsmethoden können in der erweiterten Klasse nicht auf private Daten zugreifen.

Weitere Informationen