Jika Anda mengontrol tempat-tempat di mana Anda ingin menggunakan "operator ekstensi" ini (yang biasanya Anda lakukan dengan metode ekstensi), Anda dapat melakukan sesuatu seperti ini:
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;
}
}
The StringBuilderWrapper
kelas menyatakan sebuah operator konversi implisit dari StringBuilder
dan menyatakan yang diinginkan +
operator. Dengan cara ini, a StringBuilder
dapat diteruskan ke ReceiveImportantMessage
, yang akan secara diam-diam dikonversi menjadi a StringBuilderWrapper
, di mana +
operator dapat digunakan.
Untuk membuat fakta ini lebih transparan bagi penelepon, Anda dapat mendeklarasikan ReceiveImportantMessage
sebagai mengambil StringBuilder
dan hanya menggunakan kode seperti ini:
private static void ReceiveImportantMessage(StringBuilder sb) {
StringBuilderWrapper sbw = sb;
sbw += "Hello World!";
}
Atau, untuk menggunakannya sebaris di mana Anda sudah menggunakan StringBuilder
, Anda bisa melakukan ini:
StringBuilder sb = new StringBuilder();
StringBuilderWrapper sbw = sb;
sbw += "Hello World!";
Console.WriteLine(sb.ToString());
Saya membuat posting tentang menggunakan pendekatan yang sama untuk membuat IComparable
lebih mudah dimengerti.