Якщо ви керуєте місцями, де ви хочете використовувати цього "оператора розширення" (що зазвичай ви робите з методами розширення), ви можете зробити щось подібне:
class Program {
static void Main(string[] args) {
StringBuilder sb = new StringBuilder();
ReceiveImportantMessage(sb);
Console.WriteLine(sb.ToString());
}
// the important thing is to use StringBuilderWrapper!
private static void ReceiveImportantMessage(StringBuilderWrapper sb) {
sb += "Hello World!";
}
}
public class StringBuilderWrapper {
public StringBuilderWrapper(StringBuilder sb) { StringBuilder = sb; }
public StringBuilder StringBuilder { get; private set; }
public static implicit operator StringBuilderWrapper(StringBuilder sb) {
return new StringBuilderWrapper(sb);
}
public static StringBuilderWrapper operator +(StringBuilderWrapper sbw, string s) {
sbw.StringBuilder.Append(s);
return sbw;
}
}
StringBuilderWrapper
Клас оголошує оператор неявного перетворення з StringBuilder
і оголошує потрібний +
оператор. Таким чином, StringBuilder
може бути переданий файл ReceiveImportantMessage
, який буде мовчки перетворений в a StringBuilderWrapper
, де +
оператор може бути використаний.
Щоб зробити цей факт більш прозорим для абонентів, ви можете оголосити ReceiveImportantMessage
, що приймає StringBuilder
та просто використовувати такий код:
private static void ReceiveImportantMessage(StringBuilder sb) {
StringBuilderWrapper sbw = sb;
sbw += "Hello World!";
}
Або, щоб використовувати його в рядку там, де ви вже використовуєте StringBuilder
, ви можете просто зробити це:
StringBuilder sb = new StringBuilder();
StringBuilderWrapper sbw = sb;
sbw += "Hello World!";
Console.WriteLine(sb.ToString());
Я створив пост про використання подібного підходу, щоб зробити його IComparable
більш зрозумілим.