2009-05-15 5 views
131

Можно создать дубликат:
Can I add extension methods to an existing static class?Статические методы расширения

Есть ли способ, я могу добавить статический метод расширения для класса.

конкретно я хочу перегрузить Boolean.Parse, чтобы разрешить аргумент int.

+7

, как это может быть дубликат? Это хочет добавить метод расширения, который ведет себя как статический (класс) метод к классу, который может иметь такие экземпляры, как Boolean, тогда как в другом вопросе спрашивается, как добавить метод расширения к статическому классу –

+1

было бы неплохо, если бы поддерживался синтаксис C# например: «public static DependencyProperty Register (статический DependencyProperty x, имя строки, Type propertyType, Type ownerType, FrameworkPropertyMetadata typeMetadata)», чтобы я мог использовать его в Silverlight для обеспечения совместимости с синтаксисом WPF (чтобы обернуть внедрение принудительного значения Dr.WPF для DependencyProperty). Обратите внимание на параметр «статический DependencyProperty» вместо «this DependencyProperty» (альтернативно вместо статического, возможно, они могут использовать другое ключевое слово типа type или typeof). –

+0

Такая же проблема с 'Enum.Parse' с предоставлением строки. К сожалению, расширение строки не так очевидно, как расширение int. C# отсутствует синтаксис! – C4u

ответ

125

Короче говоря, нет, вы не можете.

Длинный ответ, методы расширения - это просто синтаксический сахар. IE:

если у вас есть метод расширения строки, скажем:

public static string SomeStringExtension(this string s) 
{ 
    //whatever.. 
} 

Когда вы затем вызвать его:

myString.SomeStringExtension(); 

компилятор просто превращает ее в

ExtensionClass.SomeStringExtension(myString); 

Таким образом, вы можете видеть, что для статических методов нет способа сделать это.

И еще одна вещь, которая просто озарила меня: что действительно будет point быть в состоянии добавить статические методы в существующие классы? Вы можете просто иметь свой собственный вспомогательный класс, который делает то же самое, так что на самом деле benfit в возможности сделать:

Bool.Parse(..) 

vs.

Helper.ParseBool(..); 

ли на самом деле не много приносит к столу ...

+136

* Какова была бы возможность добавить статические методы к существующим классам? * Во многих случаях я хотел сделать это неоднократно. Мое рассуждение: я хочу расширить 'String.Reconvert' как метод расширения. Я мог бы написать «Helper.ReconvertString», но с помощью Visual Studio и автозаполнения мои сотрудники не будут искать «Помощник». Они будут искать метод «String», и не найдя его, скорее всего, перейдут и заново изобретают колесо. – abelenky

+79

Я полностью не согласен, преимущество этого было бы тем же самым преимуществом, которое обеспечивают методы расширенного расширения. Я мог бы также использовать вспомогательные классы для выполнения той же цели, что и обычные методы расширения, но почему я должен, когда подход расширения более элегантен для работы. Синтаксический сахар полезен, будь то instanced или static. – WiredWiz

+31

Я думаю, что они принесут столько же, сколько и синтаксическому сахару. Речь идет о доступности и о том, что вы ожидаете, что они будут в популярных классах, а не в неясных помощниках. Например, был бы полезен метод расширения, такой как DateTime.FromNanoseconds, или DateTime.FromSecondsSinceEpoch. Они не имеют смысла как метод экземпляра, поскольку они по существу являются конструкторами, но их легко найти как статические методы расширения. Причина в том, что кластерные классы просто неполны, и методы расширения являются обходным путем для их завершения. – Triynko

-7

Нет, но вы могли бы иметь что-то вроде:

bool b; 
b = b.YourExtensionMethod(); 
65

специально я хочу перегрузить Boolean.Parse, чтобы разрешить int аргумент.

Может ли расширение для int работать?

public static bool ToBoolean(this int source){ 
    //do it 
    //return it 
} 

Тогда вы можете назвать это так:

int x = 1; 

bool y=x.ToBoolean(); 
+11

+1 для творчества. Вы не ответили на его вопрос, но я считаю, что вы нашли самое элегантное решение. Особенно учитывая, что буквально «разбор» означает анализ _string_ :) (см. [Определение] (http://en.wikipedia.org/wiki/Parsing)) – tsemer

+1

Не забывайте, int - значение Тип. Вам нужно использовать это как @bsneeze 'y = x.ToBoolean()', потому что в методах расширения для типов значений значения ** NOT ** передаются по ссылке. – LuckyLikey

-2

Вы можете добавить метод расширения для Int

public static class IntExtensions 
{ 
    public static bool Parse(this int value) 
    { 
     if (value == 0) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 
    public static bool? Parse2(this int value) 
    { 
     if (value == 0) 
     { 
      return true; 
     } 
     if (value == 1) 
     { 
      return false; 
     } 
     return null; 
    } 
} 

используется как этот

 bool bool1 = 0.Parse(); 
     bool bool2 = 1.Parse(); 

     bool? bool3 = 0.Parse2(); 
     bool? bool4 = 1.Parse2(); 
     bool? bool5 = 3.Parse2(); 
+4

Это не отвечает на вопрос. Это только демонстрирует обычный метод расширения, который вызывается в экземпляре 'int', в этом случае 0, 1, 2 или 3. Литерал' int 'является таким же экземпляром, как и переменная. – ProfK

+2

Кроме того, не делайте этого. Когда-либо. '1.Parse()' не имеет смысла, как 'My String" ÷ 6'. Ваш код должен быть понятным и понятным другим. Для «Parse» необходимо «проанализировать строку» в качестве @tsemer, упомянутого выше. –