Практическое руководство. Реализация и вызов пользовательского метода расширения (руководство по программированию на C#)
В этой статье показано, как реализовать собственные методы расширения для любого типа .NET. Клиентский код может использовать методы расширения. Клиентские проекты должны ссылаться на сборку, содержащую их. Клиентские проекты должны добавить директиву using , указывающую пространство имен, в котором определены методы расширения.
Чтобы определить и вызвать метод расширения:
- Определите статический класс, который будет содержать метод расширения. Класс не может быть вложен в другой тип и должен быть видимым для клиентского кода. Дополнительные сведения о правилах доступа см. в разделах Модификаторы доступа.
- Реализуйте метод расширения как статический метод как минимум с тем же уровнем видимости, что и содержащий класс.
- Первый параметр метода указывает тип, с которым работает метод. Ему должен предшествовать модификатор this.
- В вызывающем коде добавьте директиву
using
, чтобы задать пространство имен, содержащее класс метода расширения. - Вызовите методы в качестве методов экземпляра в типе.
Примечание.
Первый параметр не указан путем вызова кода, так как он представляет тип, к которому применяется оператор, и компилятор уже знает тип объекта. Вам необходимо предоставить аргументы только для параметров со 2 по n
.
В приведенном ниже примере реализуется метод расширения с именем WordCount
в классе CustomExtensions.StringExtension
. Метод работает с классом String класса, который указан как первый параметр метода. Пространство имен CustomExtensions
импортируется в пространство имен приложения, и метод вызывается внутри метода Main
.
using CustomExtensions;
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);
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;
}
}
}
Разрешение перегрузки предпочитает экземпляр или статический метод, определенный самим типом для методов расширения. Методы расширения не могут получить доступ к частным данным в расширенном классе.