如果您控制要使用此“扩展运算符”的位置(无论如何您通常都使用扩展方法),您可以执行以下操作:
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更易于理解的帖子。