Estoy intentando usar métodos de extensión para agregar una sobrecarga de operadores a la StringBuilder
clase 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 blah
mé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 this
no 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
String
un 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
StringBuilderWrapper
clase declara un operador de conversión implícito de aStringBuilder
y declara el+
operador deseado . De esta forma,StringBuilder
se 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
ReceiveImportantMessage
que toma unStringBuilder
có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
IComparable
más comprensible.fuente
StringBuilderWrapper
que lo hace posible.StringBuilder
tipo 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
AppendLine
lugar 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