Практическое руководство. Реализация и вызов пользовательского метода расширения (руководство по программированию на C#)

Этот раздел описывает, как реализовать свои методы расширения для любого типа .NET Framework. Клиентский код может использовать методы расширения путем добавления ссылки на содержащую их библиотеку DLL и добавления директивы using, которая указывает пространство имен, в котором определены методы расширения.

Определение и вызов метода расширения

  1. Определите статический класс, который будет содержать метод расширения.

    Класс должен быть видимым для клиентского кода. Дополнительные сведения о правилах доступа см. в разделах Модификаторы доступа.

  2. Реализуйте метод расширения как статический метод как минимум с тем же уровнем видимости, что и содержащий класс.

  3. Первый параметр метода указывает тип, с которым работает метод. Ему должен предшествовать модификатор this.

  4. В вызывающем коде добавьте директиву using, чтобы задать пространство имен, содержащее класс метода расширения.

  5. Вызовите методы, как если бы они являлись методами экземпляра для типа.

    Обратите внимание, что первый параметр не указан вызывающим кодом, поскольку он представляет тип, к которому применяется оператор, и компилятору уже известен тип объекта. Вам необходимо предоставить аргументы только для параметров со 2 по n.

Пример

В приведенном ниже примере реализуется метод расширения с именем WordCount в классе CustomExtensions.StringExtension. Метод работает с классом String класса, который указан как первый параметр метода. Пространство имен CustomExtensions импортируется в пространство имен приложения, и метод вызывается внутри метода Main.

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

Методы расширения не предоставляют определенных уязвимостей безопасности. Они не могут использоваться для олицетворения существующих методов для типа, поскольку все конфликты имен разрешаются в пользу метода экземпляра или статического метода, определяемого самим типом. Методы расширения не могут получить доступ к любым конфиденциальным данным в расширенном классе.

См. также