Ich versuche, Erweiterungsmethoden zu verwenden, um der C # StringBuilder
-Klasse eine Operaterüberladung hinzuzufügen . Insbesondere StringBuilder
sb
würde ich gerne sb += "text"
gleichwertig werden mit sb.Append("text")
.
Hier ist die Syntax zum Erstellen einer Erweiterungsmethode für StringBuilder
:
public static class sbExtensions
{
public static StringBuilder blah(this StringBuilder sb)
{
return sb;
}
}
Die blah
Erweiterungsmethode wird erfolgreich zum hinzugefügt StringBuilder
.
Leider scheint die Überlastung des Bedieners nicht zu funktionieren:
public static class sbExtensions
{
public static StringBuilder operator +(this StringBuilder sb, string s)
{
return sb.Append(s);
}
}
Unter anderem ist das Schlüsselwort this
in diesem Zusammenhang nicht zulässig.
Ist das Hinzufügen von Operatorüberladungen über Erweiterungsmethoden möglich? Wenn ja, wie geht man richtig vor?
c#
extension-methods
operator-overloading
Jude Allred
quelle
quelle
Antworten:
Dies ist derzeit nicht möglich, da Erweiterungsmethoden in statischen Klassen vorliegen müssen und statische Klassen keine Operatorüberladungen aufweisen dürfen.
Mads Torgersen, PM in C # -Sprache, sagt:
Bearbeiten:
Mir ist gerade aufgefallen, dass Mads im selben Artikel mehr geschrieben hat :
Diese Funktion ist derzeit (möglicherweise) für C # 8.0 verfügbar. Mads spricht ein bisschen mehr darüber die Umsetzung hier .
quelle
String
um eine PowerShell zu übertragenScriptBlock
.true.Xor(false)
dann^
ist der xor-Operator in C #Wenn Sie die Stellen steuern, an denen Sie diesen "Erweiterungsoperator" verwenden möchten (was Sie normalerweise sowieso mit Erweiterungsmethoden tun), können Sie Folgendes tun:
Die
StringBuilderWrapper
Klasse deklariert einen impliziten Konvertierungsoperator von aStringBuilder
und deklariert den gewünschten+
Operator. Auf diese WeiseStringBuilder
kann a an übergeben werdenReceiveImportantMessage
, das stillschweigend in a konvertiert wirdStringBuilderWrapper
, wo der+
Operator verwendet werden kann.Um diese Tatsache für Anrufer transparenter zu machen, können Sie deklarieren, dass Sie einen
ReceiveImportantMessage
nehmenStringBuilder
und einfach Code wie diesen verwenden:Um es inline zu verwenden, wo Sie bereits ein verwenden
StringBuilder
, können Sie dies einfach tun:Ich habe einen Beitrag über einen ähnlichen Ansatz erstellt, um ihn
IComparable
verständlicher zu machen .quelle
StringBuilderWrapper
, der dies ermöglicht.StringBuilder
Typ umschließt und einen impliziten Konvertierungsoperator daraus bereitstellt. Danach kann es mit String-Literalen verwendet werden, wie im folgenden Beispiel gezeigt:sb += "Hello World!";
String
:PushIndent(" ".X(4))
(könnte auch aufgerufen werdenTimes
). Oder vielleicht mit diesem Konstruktor :PushIndent(new String(' ', 4))
.Es scheint, dass dies derzeit nicht möglich ist. Es gibt ein offenes Feedback-Problem, bei dem genau diese Funktion in Microsoft Connect angefordert wird:
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=168224
Dies deutet darauf hin, dass es möglicherweise in einer zukünftigen Version erscheint, aber für die aktuelle Version nicht implementiert ist.
quelle
Obwohl es nicht möglich ist, die Operatoren auszuführen, können Sie immer nur die Methoden Add (oder Concat), Subtract und Compare erstellen.
quelle
Hah! Ich habe mit genau dem gleichen Wunsch nach "jb + = (thing)" "Extension Operator Overloading" gesucht.
Nachdem ich die Antworten hier gelesen hatte (und festgestellt hatte, dass die Antwort "Nein" ist), entschied ich mich für eine spezielle Erweiterungsmethode, die sb.AppendLine und sb.AppendFormat kombiniert und ordentlicher aussieht als beide.
Und so,
Keine allgemeine Antwort, kann aber für zukünftige Suchende von Interesse sein, die sich mit solchen Dingen befassen.
quelle
AppendLine
anstelle von benennen würdenLine
.Es ist möglich, es mit einem Wrapper und Erweiterungen auszurüsten, aber es ist unmöglich, es richtig zu machen. Sie enden mit Müll, der den Zweck völlig zunichte macht. Ich habe irgendwo hier oben einen Beitrag, der das macht, aber es ist wertlos.
Übrigens: Bei allen numerischen Konvertierungen entsteht im String Builder Müll, der behoben werden muss. Ich musste einen Wrapper für das schreiben, was funktioniert und ich benutze ihn. Das ist es wert, durchgesehen zu werden.
quelle