Я пытаюсь использовать методы расширения для добавления перегрузки оператора в StringBuilder
класс C # . В частности, учитывая StringBuilder
sb
, я хотел бы sb += "text"
стать эквивалентным sb.Append("text")
.
Вот синтаксис для создания метода расширения для StringBuilder
:
public static class sbExtensions
{
public static StringBuilder blah(this StringBuilder sb)
{
return sb;
}
}
Он успешно добавляет blah
метод расширения к StringBuilder
.
К сожалению, перегрузка оператора, похоже, не работает:
public static class sbExtensions
{
public static StringBuilder operator +(this StringBuilder sb, string s)
{
return sb.Append(s);
}
}
Среди других вопросов, ключевое слово this
не допускается в этом контексте.
Возможно ли добавить перегрузки операторов с помощью методов расширения? Если да, то как правильно это сделать?
c#
extension-methods
operator-overloading
Джуд аллред
источник
источник
Ответы:
В настоящее время это невозможно, поскольку методы расширения должны быть в статических классах, а статические классы не могут иметь перегрузки операторов.
Мадс Торгерсен, C # Language PM говорит:
Редактировать:
Я только что заметил, Мэдс написал больше в той же статье :
Эта функция в настоящее время на столе (потенциально) для C # 8.0. Мэдс говорит немного больше о реализации этого здесь .
источник
String
в PowerShellScriptBlock
.true.Xor(false)
тогда^
- оператор xor в C #Если вы контролируете места, где вы хотите использовать этот «оператор расширения» (что вы обычно делаете с методами расширения), вы можете сделать что-то вроде этого:
StringBuilderWrapper
Класс объявляет оператор неявного преобразования изStringBuilder
и объявляет нужный+
оператор. Таким образом,StringBuilder
можно передать aReceiveImportantMessage
, который будет молча преобразован в aStringBuilderWrapper
, где+
оператор может быть использован.Чтобы сделать этот факт более прозрачным для вызывающих, вы можете объявить,
ReceiveImportantMessage
что он принимает,StringBuilder
и просто использовать такой код:Или, чтобы использовать его там, где вы уже используете
StringBuilder
, вы можете просто сделать это:Я создал пост об использовании подобного подхода, чтобы сделать его
IComparable
более понятным.источник
StringBuilderWrapper
том , что делает это возможным.StringBuilder
тип и предоставит из него неявный оператор преобразования. После этого его можно использовать со строковыми литералами, как показано в примере:sb += "Hello World!";
String
:PushIndent(" ".X(4))
(также может быть вызванTimes
). Или , может быть , с помощью этого конструктора:PushIndent(new String(' ', 4))
.Похоже, что в настоящее время это невозможно - существует проблема с открытым отзывом, запрашивающая эту функцию в Microsoft Connect:
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=168224
предполагая, что это может появиться в будущем выпуске, но не реализовано для текущей версии.
источник
Хотя это невозможно сделать операторы, вы всегда можете просто создать методы Add (или Concat), Subtract и Compare ....
источник
Хах! Я искал "перегрузку оператора расширения" с точно таким же желанием, для sb + = (вещь).
Прочитав ответы здесь (и увидев, что ответ «нет»), для своих конкретных нужд я выбрал метод расширения, который комбинирует sb.AppendLine и sb.AppendFormat и выглядит более аккуратно, чем любой из них.
Так что,
Не общий ответ, но может быть интересен будущим ищущим, рассматривающим подобные вещи.
источник
AppendLine
вместоLine
.Его можно оснастить оберткой и расширениями, но невозможно сделать это правильно. Вы заканчиваете мусором, который полностью побеждает цель. У меня где-то здесь есть пост, который делает это, но это бесполезно.
Кстати, все числовые преобразования создают мусор в строителе строк, который необходимо исправить. Я должен был написать обертку для того, что работает, и я использую ее. Это стоит изучить.
источник