如果控制要使用此“扩展运算符”的位置(通常无论如何都使用扩展方法),则可以执行以下操作:
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
可以将a传递给ReceiveImportantMessage
,然后将其静默转换为StringBuilderWrapper
,+
可以在其中使用运算符。
为了使这一事实对调用者更加透明,您可以声明ReceiveImportantMessage
为a 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
更易于理解的文章。