Есть ли способ добавить к классу метод статического расширения.
в частности, я хочу перегрузить Boolean.Parse
, чтобы разрешить int
аргумент.
Есть ли способ добавить к классу метод статического расширения.
в частности, я хочу перегрузить Boolean.Parse
, чтобы разрешить int
аргумент.
Короче нет, нельзя.
Длинный ответ, методы расширения - это просто синтаксический сахар. IE:
Если у вас есть метод расширения для строки, скажем:
public static string SomeStringExtension(this string s)
{
//whatever..
}
Когда вы потом назовете это:
myString.SomeStringExtension();
Компилятор просто превращает это в:
ExtensionClass.SomeStringExtension(myString);
Как видите, для статических методов это невозможно.
И еще одна вещь меня осенила: в чем действительно будет смысл возможности добавлять статические методы к существующим классам? У вас может быть просто собственный вспомогательный класс, который делает то же самое, так что в чем на самом деле польза от возможности:
Bool.Parse(..)
vs.
Helper.ParseBool(..);
На самом деле ничего не значит ...
String.Reconvert
как метод расширения. Я мог бы написать Helper.ReconvertString
, но, используя Visual Studio и автозаполнение, мои коллеги не смотрели бы под Helper
. Они будут искать String
метод и, не найдя его, скорее всего, пойдут и заново изобретут колесо.
- person abelenky; 30.10.2013
string.Join
вместо отдельного класса StringHelpers во фреймворке. Тем не менее, я ненавижу, когда я ожидаю метод расширения и мне приходится искать подходящее пространство имен для добавления. По крайней мере, с классами я могу щелкнуть правой кнопкой мыши и решить добавить using
.
- person Jason Goemaat; 03.03.2015
Int32
предоставляет Parse(String)
, Parse(String, IFormatProvider)
, Parse(String, NumberStyles)
, Parse(String, NumberStyles, IFormatProvider)
перегрузки, но класс Boolean
предоставляет только Parse(String)
. Разве не было бы замечательно иметь хотя бы Bool.Parse(String, IFormatProvider)
перегрузку, чтобы можно было переводить истинные / ложные значения с других языков? например Cierto / Falso (испанский), Vrai / Faux (французский) и Правда / Ложь (русский)?
- person AlwaysLearning; 13.01.2016
StringExtensions.Reconvert(...)
- бац, проблема решена осмысленным образом, который читается, недвусмысленно, разумно и хорошо работает с IntelliSense. Это также позволяет вам размещать как методы расширения экземпляра, так и методы статического расширения как таковые в одном классе.
- person John Weisz; 09.06.2016
*Extensions
. Это также намного проще, чем Helpers
, поскольку его можно рассматривать как совершенно другой подход - когда вы ищете статический метод на String
, вы начнете с ввода Str...
, после чего статический класс StringExtensions
уже должен быть в списке предлагаемых слов для автозаполнения, его название четко указывает на его намерение.
- person John Weisz; 17.08.2016
в частности, я хочу перегрузить
Boolean.Parse
, чтобы разрешить аргумент int.
Будет ли работать расширение для int?
public static bool ToBoolean(this int source){
// do it
// return it
}
Тогда вы можете назвать это так:
int x = 1;
bool y = x.ToBoolean();
y=x.ToBoolean()
, потому что в методах расширения для типов значений значения НЕ передаются по ссылке.
- person LuckyLikey; 10.06.2015
Нет, но у вас может быть что-то вроде:
bool b;
b = b.YourExtensionMethod();
Enum.Parse
с предоставлением строки. К сожалению, расширение строки не так очевидно, как расширение int. В C # отсутствует синтаксис! - person C4d   schedule 18.08.2016