Как распространить методы на класс, а не на его экземпляры - PullRequest
1 голос
/ 02 мая 2010

Расширение методов на любой экземпляр действительно просто:

public static string LeaveJustNumbers(this string text)
{
    return Regex.Replace(text, @"[\D]", "");
}
...
string JustNumbers = "A5gfb343j4".LeaveJustNumber();

Но что, если я захочу расширить методы до запечатанного класса, такого как строка, работать как:

string.Format("Hi:{0}","Fraga");

Есть ли способ сделать это?

1 Ответ

4 голосов
/ 02 мая 2010

Если вы говорите о «расширении» статических методов (или замене существующих), то, насколько я знаю, нет, вы не можете это сделать, и я не уверен, почему вы захотите.

Суть методов расширения такова, что стиль вызова - это стиль вызова метода в экземпляре. Это позволяет, среди прочего, более элегантный синтаксис и цепочку методов. LINQ без методов расширения будет ужасно болезненным, например.

У вас есть три варианта, один из которых чрезвычайно ужасен:

Создание обычного метода расширения, который вызывает статический метод

public static string SomeExtensionMethod(this string name) 
{
    return string.Format("Hi:{0}", name);
}

Использование:

Console.WriteLine("Mr Smith".SomeExtensionMethod());

Создайте статический вспомогательный класс и сделайте вызов, используя этот

 Console.WriteLine(MyHelperClass.SomeMethod("Mr Smith"));

И злой

Создайте статический вспомогательный класс с тем же именем, что и тип, который вы хотите «расширить» (например, общедоступный класс String) ... затем продублируйте сигнатуру статического целевого метода (Format) и наблюдайте, как все плачут от горячих соленых слез путаницы, когда они видят тип с именем «string», который не входит в пространство имен «System», и им приходится разбирать свой файл .cs с использованием String = MyCrazyHacks.String и / или явных пространств имен.

Я даже не уверен, что вы могли бы сделать это для «строки», так как это псевдоним для System.String, поэтому я изменил пример, чтобы использовать вместо него имя «String».

namespace MyCrazyHacks
{
    public static class String
    {
        public static System.String Format(
         System.String str, params object[] zeParams)
        {
            // do bad, unspeakable things that confuses everyone
            return System.String.Format(....); 
        }
    }
}

Примечание: пожалуйста, не делайте этого, потому что вы будете причинять большие страдания ...

...