如果您控制要使用此“扩展运算符”的位置(无论如何您通常都使用扩展方法),您可以执行以下操作:
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;
}
}
该类从 aStringBuilderWrapper
声明一个隐式转换运算符StringBuilder
并声明所需的+
运算符。这样,StringBuilder
可以将 a 传递给ReceiveImportantMessage
,它将被静默转换为 a StringBuilderWrapper
,+
可以在其中使用运算符。
为了使这一事实对调用者更透明,您可以声明ReceiveImportantMessage
为采用 aStringBuilder
并使用如下代码:
private static void ReceiveImportantMessage(StringBuilder sb) {
StringBuilderWrapper sbw = sb;
sbw += "Hello World!";
}
或者,要在您已经使用 a 的地方内联使用它StringBuilder
,您可以简单地执行以下操作:
StringBuilder sb = new StringBuilder();
StringBuilderWrapper sbw = sb;
sbw += "Hello World!";
Console.WriteLine(sb.ToString());
我创建了一篇关于使用类似方法以使其IComparable
更易于理解的帖子。