Jak zaimplementować i wywołać niestandardową metodę rozszerzenia (Przewodnik programowania w języku C#)

W tym temacie pokazano, jak zaimplementować własne metody rozszerzenia dla dowolnego typu platformy .NET. Kod klienta może używać metod rozszerzenia, dodając odwołanie do biblioteki DLL zawierającej je i dodając dyrektywę using określającą przestrzeń nazw, w której zdefiniowano metody rozszerzenia.

Aby zdefiniować i wywołać metodę rozszerzenia

  1. Zdefiniuj klasę statyczną zawierającą metodę rozszerzenia.

    Klasa musi być widoczna dla kodu klienta. Aby uzyskać więcej informacji na temat reguł ułatwień dostępu, zobacz Modyfikatory dostępu.

  2. Zaimplementuj metodę rozszerzenia jako metodę statyczną z co najmniej taką samą widocznością jak zawierająca klasa.

  3. Pierwszy parametr metody określa typ, na którym działa metoda; musi być poprzedzony tym modyfikatorem.

  4. W kodzie wywołującym dodaj dyrektywę using , aby określić przestrzeń nazw zawierającą klasę metody rozszerzenia.

  5. Wywołaj metody tak, jakby były metodami wystąpienia w typie.

    Należy pamiętać, że pierwszy parametr nie jest określony przez wywołanie kodu, ponieważ reprezentuje typ, na którym jest stosowany operator, a kompilator zna już typ obiektu. Wystarczy podać argumenty parametrów od 2 do n.

Przykład

Poniższy przykład implementuje metodę rozszerzenia o nazwie WordCount w CustomExtensions.StringExtension klasie . Metoda działa na String klasie, która jest określona jako pierwszy parametr metody. CustomExtensions Przestrzeń nazw jest importowana do przestrzeni nazw aplikacji, a metoda jest wywoływana Main wewnątrz metody .

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

Zabezpieczenia platformy .NET

Metody rozszerzeń nie zawierają konkretnych luk w zabezpieczeniach. Nigdy nie można ich używać do personifikacji istniejących metod w typie, ponieważ wszystkie kolizje nazw są rozpoznawane na rzecz wystąpienia lub metody statycznej zdefiniowanej przez sam typ. Metody rozszerzeń nie mogą uzyskać dostępu do żadnych danych prywatnych w klasie rozszerzonej.

Zobacz też