// порядок следования десятичных цифр на обратный.
// Например, для 56 возвратится 65.
public static int ReverseDigits(this int i)
{
// Транслировать int в string и затем получить все его символы.
char[] digits = i.ToString().ToCharArray();
// Изменить порядок следования элементов массива.
Array.Reverse(digits);
// Поместить обратно в строку.
string newDigits = new string(digits);
// Возвратить модифицированную строку как int.
return int.Parse(newDigits);
}
}
}
Снова обратите внимание на то, что первый параметр каждого расширяющего метода снабжен ключевым словом this
DisplayDefiningAssembly() был прототипирован для расширения System.Object, этот новый член теперь присутствует в каждом типе, поскольку Object является родительским для всех типов платформы .NET Core. Однако метод ReverseDigits() прототипирован для расширения только целочисленных типов, и потому если к нему обращается какое-то другое значение, то возникнет ошибка на этапе компиляции.На заметку!
Запомните, что каждый расширяющий метод может иметь множество параметров, но только первый параметр разрешено помечать посредствомthis. Дополнительные параметры будут трактоваться как нормальные входные параметры, применяемые методом.Вызов расширяющих методов
Располагая созданными расширяющими методами, рассмотрим следующий код, в котором они используются с разнообразными типами из библиотек базовых классов:
using System;
using MyExtensionMethods;
Console.WriteLine("***** Fun with Extension Methods *****\n");
// В int появилась новая отличительная черта!
int myInt = 12345678;
myInt.DisplayDefiningAssembly();
// И в SoundPlayer!
System.Data.DataSet d = new System.Data.DataSet();
d.DisplayDefiningAssembly();
// Использовать новую функциональность int.
Console.WriteLine("Value of myInt: {0}", myInt);
Console.WriteLine("Reversed digits of myInt: {0}",
myInt.ReverseDigits());
Console.ReadLine();
Ниже показан вывод:
***** Fun with Extension Methods *****
Int32 lives here: => System.Private.CoreLib
DataSet lives here: => System.Data.Common
Value of myInt: 12345678
Reversed digits of myInt: 87654321
Импортирование расширяющих методов
Когда определяется класс, содержащий расширяющие методы, он вне всяких сомнений будет принадлежать какому-то пространству имен. Если это пространство имен отличается от пространства имен, где расширяющие методы применяются, тогда придется использовать ключевое слово using
Хотя на первый взгляд может показаться, что расширяющие методы глобальны по своей природе, на самом деле они ограничены пространствами имен, где определены, или пространствами имен, которые их импортируют. Вспомните, что вы поместили класс MyExtensions
MyExtensionMethods, как показано ниже:namespace MyExtensionMethods
{
static class MyExtensions
{
...
}
}
Для использования расширяющих методов класса MyExtensions
MyExtensionMethods, как делалось в рассмотренных ранее примерах операторов верхнего уровня. Расширение типов, реализующих специфичные интерфейсы