Методы расширения C#

11 Авг
2011

Одной из фич C# 3.0 является Методы Расширения (Extension Methods)
Методы расширения позволяют добавлять методы в уже существующие типы, без создания нового производного типа.
Для примера, расширим возможности типа System.String простой функций FormatString, которая будет аналогична методу string.Format();
Обычно «форматирование» строчки делается следующим образом

class Program
    {        
        static void Main(string[] args)
        {
            string s = "Hello {0}";
            Console.WriteLine(string.Format(s, "world!"));
            Console.ReadLine();
        }
    }

Результат работы:

Hello world!

Каждый раз писать string.Format не удобно. Попробуем сделать жизнь проще.
Для начала расширяем класс System.String

static class StringExtensions
    {
        public static string FormatString(this string currentString, params object[] args)
        {
            if (args == null || args.Length == 0)
            {
                return currentString;
            }
            else
            {
                return string.Format(currentString, args);
            }
        }
    }

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

Перепишем нашу программу, с учетом нашего расширения

static class StringExtensions
    {
        public static string FormatString(this string currentString, params object[] args)
        {
            if (args == null || args.Length == 0)
            {
                return currentString;
            }
            else
            {
                return string.Format(currentString, args);
            }
        }
    }

    class Program
    {
        
        static void Main(string[] args)
        {
            string s = "Hello {0}";
            Console.WriteLine(s.FormatString("world!"));
            Console.WriteLine("Hello my dear {0} {1}".FormatString("world", ":)"));            
            Console.ReadLine();
        }
    }

Результат работы:

Hello world!
Hello my dear world :)

Удобство на лицо!

Множество готовых примеров расширения методов можно найти на сайте: ExtensionMethod.net

2 комментария к записи Методы расширения C#

Avatar

Адель

13th Август 2011 в 06:10

string a = string.Format(«Hello {0}», «world!»));
string b = («Hello my dear {0} {1}».FormatString(«world», «:)»));

string c = string.Format(«Hello {0} {1} {2}», «dear», «world!», «:)»));
Или вариант с не рабочий? Очевидно нет, туда же массив надо передавать, тем не менее…

Правильно ли я понимаю, что этот метод появится у всех string овых переменных в проекте?

Avatar

Сергей

15th Август 2011 в 10:51

Вариант С тоже рабочий. Если верить MSDN’у, то можно передавать неопределенное кол-во параметров.

Все зависит от того в какой namespace будет объявлен метод расширения.
К примеру если сам проект ведется в namespace app, а метод расширения в appCommonExtensions, то в нужных классах прописать необходимо using appCommonExtensions.

Оставить комментарий или два

Наверх
Rambler's Top100