Методы расширения в C#
Содержание
C# поддерживает несколько способов расширения существующих типов без изменения существующего кода.
Существует два разных способа: методы расширения и переопределение.
Методы расширения:
Методы расширения позволяют добавлять новые возможности к существующему типу. Вам не нужно вносить какие-либо изменения в существующий тип, просто принесите метод расширения в область видимости, и вы можете называть его как обычный метод экземпляра.
Методы расширения должны быть объявлены в негенерированном, не вложенном, статическом классе.
Пример:
namespace ConsoleApplication11 { //методы расширения должны быть определены в статическом классе static class IntMethods { //методы расширения должны быть статическими //это ключевое слово говорит C#, что это метод расширения public static bool IsPrime(this int number) { //проверить равномерность if (number % 2 == 0) { if (number == 2) return true; return false; } //вам не нужно проверять квадратный корень int max = (int)Math.Sqrt(number); for (int i = 3; i <= max; i += 2) { if ((number % i) == 0) { return false; } } return true; } } class Program { static void Main(string[] args) { for (int i = 0; i < 100; ++i) { if (i.IsPrime()) { Console.WriteLine(i); } } Console.ReadKey(); } } }
Заметка:
- Разница между регулярным статическим методом и методом расширения - это специальное ключевое слово для первого аргумента.
- Метод расширения не может быть объявлен в классе или структуре.
- Он также может быть объявлен на интерфейсе (например, IEnumerable <T>). Обычно интерфейс не будет иметь никакой реализации. Однако с помощью методов расширения вы можете добавлять методы, которые будут доступны для каждой конкретной реализации интерфейса
- Language Integrated Query (LINQ) - один из лучших примеров того, как вы можете использовать этот метод для улучшения существующего кода.
Примеры использования для методов расширения в C#
Давайте обсудим несколько вариантов использования для использования методов расширения.
1. Присоединить метаданные к перечислениям с помощью методов расширения
вы можете добавить метод к вашему перечислению, чтобы получить доступ к значениям, прикрепленным к атрибутам.
Давайте создадим атрибут для этого примера.
[AttributeUsage(AttributeTargets.All, AllowMultiple = true)] class CultureAttribute : Attribute { string _culture; public string Culture { get { return _culture; } } public CultureAttribute(string culture) { _culture = culture; } }
Давайте создадим Enum:
enum BookLanguage { None = 0, [Culture(“en-US”)] [Culture(“en-UK”)] English = 1, [Culture(“es-MX”)] [Culture(“es-ES”)] Spanish = 2, [Culture(“it-IT”)] Italian = 3, [Culture(“fr-FR”)] [Culture(“fr-BE”)] French = 4, };
Наконец, нам нужно добавить метод расширения для доступа к этим атрибутам:
static class CultureExtensions { public static string[] GetCultures(this BookLanguage language) { //Примечание: это будет работать только для однозначных жанров CultureAttribute[] attributes = (CultureAttribute[])language.GetType().GetField( language.ToString()).GetCustomAttributes(typeof(CultureAttribute), string[] cultures = new string[attributes.Length]; for (int i = 0; i < attributes.Length; i++) { cultures[i] = attributes[i].Culture; } return cultures; } }
Теперь давайте проверим этот пример:
PrintCultures(BookLanguage.English); PrintCultures(BookLanguage.Spanish); static void PrintCultures(BookLanguage language) { Console.WriteLine(“Cultures for {0}:”, language); foreach (string culture in language.GetCultures()) { Console.WriteLine(“\t” + culture); } }
Выход будет:
Культуры для английского языка:
en-UK
en-US
Культуры для испанского языка:
es-MX
es-ES
2. Ускорение запросов с помощью PLINQ
Вы можете использовать метод расширения AsParallel () для ускорения запросов с помощью PLINQ
Если ваш первоначальный запрос
var query = from val in data where (ComplexCriteria(val)==true) select val; foreach (var q in query) { //результат процесса }
Где ComplexCriteria () является просто произвольной булевой функцией, которая анализирует значения в данных, то вы можете распараллелить это с помощью простого добавления:
var query = from val in data.AsParallel() where (ComplexCriteria(val)==true) select val; foreach (var q in query) { //результат процесса }
Визуальная студия поддерживает множество методов расширения. Visual Studio отмечает методы расширения в IntelliSense со стрелкой вниз, чтобы упростить их идентификацию.
В этой статье мы изучили метод расширения в C# и различные варианты использования для него.