Estoy intentando usar métodos de extensión para agregar una sobrecarga de operadores a la StringBuilderclase C # . Específicamente, dado StringBuilder sb, me gustaría sb += "text"ser equivalente a sb.Append("text").
Aquí está la sintaxis para crear un método de extensión para StringBuilder:
public static class sbExtensions
{
    public static StringBuilder blah(this StringBuilder sb)
    {
        return sb;
    }
} Agrega con éxito el blahmétodo de extensión a StringBuilder.
Desafortunadamente, la sobrecarga del operador no parece funcionar:
public static class sbExtensions
{
    public static StringBuilder operator +(this StringBuilder sb, string s)
    {
        return sb.Append(s);
    }
} Entre otras cuestiones, la palabra clave thisno está permitida en este contexto.
¿Son posibles las sobrecargas del operador mediante métodos de extensión? Si es así, ¿cuál es la forma correcta de hacerlo?
                    
                        c#
                                extension-methods
                                operator-overloading
                                
                    
                    
                        Jude Allred
fuente
                
                fuente

Respuestas:
Esto no es posible actualmente, porque los métodos de extensión deben estar en clases estáticas, y las clases estáticas no pueden tener sobrecargas del operador.
Mads Torgersen, C # Language PM dice:
Editar:
Acabo de notar que Mads escribió más en el mismo artículo :
Esta característica está actualmente en la tabla (potencialmente) para C # 8.0. Mads habla un poco más sobre implementarlo aquí .
fuente
Stringun PowerShellScriptBlock.true.Xor(false)ese momento^es el operador xor en C #Si controla los lugares donde desea utilizar este "operador de extensión" (que normalmente hace con los métodos de extensión de todos modos), puede hacer algo como esto:
los
StringBuilderWrapperclase declara un operador de conversión implícito de aStringBuildery declara el+operador deseado . De esta forma,StringBuilderse puede pasar aReceiveImportantMessage, que se convertirá silenciosamente en aStringBuilderWrapper, donde+se puede usar el operador.Para que este hecho sea más transparente para las personas que llaman, puede declarar
ReceiveImportantMessageque toma unStringBuildercódigo y simplemente usarlo de la siguiente manera:O, para usarlo en línea donde ya está usando a
StringBuilder, simplemente puede hacer esto:yo creé una publicación sobre el uso de un enfoque similar para hacer
IComparablemás comprensible.fuente
StringBuilderWrapperque lo hace posible.StringBuildertipo y proporcionará un operador de conversión implícito. Después de eso, se puede usar con literales de cadena, como se demuestra en el ejemplo:sb += "Hello World!";String:PushIndent(" ".X(4))(también podría llamarseTimes). O tal vez el uso de este constructor:PushIndent(new String(' ', 4)).Parece que esto no es posible actualmente: hay un problema de comentarios abiertos que solicita esta característica en Microsoft Connect:
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=168224
sugiriendo que podría aparecer en una versión futura, pero no está implementado para la versión actual.
fuente
Aunque no es posible hacer los operadores, siempre puedes crear los métodos Agregar (o Concat), Restar y Comparar ...
fuente
Ja! Estaba buscando "sobrecarga del operador de extensión" con exactamente el mismo deseo, para sb + = (cosa).
Después de leer las respuestas aquí (y ver que la respuesta es "no"), para mis necesidades particulares, utilicé un método de extensión que combina sb.AppendLine y sb.AppendFormat, y se ve más ordenado que cualquiera de los dos.
Y entonces,
No es una respuesta general, pero puede ser de interés para los futuros buscadores que miran este tipo de cosas.
fuente
AppendLinelugar deLine.Es posible manipularlo con un envoltorio y extensiones, pero imposible hacerlo correctamente. Terminas con basura que anula totalmente el propósito. Tengo una publicación en algún lugar aquí que lo hace, pero no tiene valor.
Por cierto, todas las conversiones numéricas crean basura en el generador de cadenas que debe corregirse. Tuve que escribir un contenedor para lo que funciona y lo uso. Vale la pena leerlo.
fuente