toma - sobreescritura de metodos c#




Sobrecarga del operador con métodos de extensión C# (4)

Aunque no es posible hacer los operadores, siempre puedes simplemente crear los métodos Add (o Concat), Substract y Compare ....

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;    

namespace Whatever.Test
{
    public static class Extensions
    {
        public static int Compare(this MyObject t1, MyObject t2)
        {
            if(t1.SomeValueField < t2.SomeValueField )
                return -1;
            else if (t1.SomeValueField > t2.SomeValueField )
            {
                return 1;
            }
            else
            {
                return 0;
            }
        }

        public static MyObject Add(this MyObject t1, MyObject t2)
        {
            var newObject = new MyObject();
            //do something  
            return newObject;

        }

        public static MyObject Subtract(this MyObject t1, MyObject t2)
        {
            var newObject= new MyObject();
            //do something
            return newObject;    
        }
    }


}

Estoy intentando usar métodos de extensión para agregar una sobrecarga de operador a la clase C # StringBuilder . Específicamente, dado StringBuilder sb , me gustaría que sb += "text" sea ​​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 método de extensión blah 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 otros problemas, la palabra clave this no está permitida en este contexto.

¿Es posible agregar sobrecargas del operador a través de métodos de extensión? Si es así, ¿cuál es la forma correcta de hacerlo?


Es posible colgarlo con un envoltorio y extensiones pero imposible hacerlo correctamente. Usted termina con basura que totalmente derrota el propósito. Tengo un mensaje en algún lado aquí que lo hace, pero es inútil.

Por cierto, todas las conversiones numéricas crean basura en el generador de cadenas que debe corregirse. Tuve que escribir un contenedor para eso que funciona y lo uso. Eso vale la pena leerlo.


Hah! Estaba buscando "sobrecarga del operador de extensión" exactamente con el mismo deseo, para sb + = (cosa).

Después de leer las respuestas aquí (y ver que la respuesta es "no"), para mis necesidades particulares, opté por un método de extensión que combina sb.AppendLine y sb.AppendFormat, y se ve más ordenado que cualquiera de los dos.

public static class SomeExtensions
{
    public static void Line(this StringBuilder sb, string format, params object[] args)
    {
        string s = String.Format(format + "\n", args);
        sb.Append(s);
    }

}

Y entonces,

sb.Line("the first thing is {0}",first);
sb.Line("the second thing is {0}", second);

No es una respuesta general, pero puede ser de interés para los futuros buscadores que miran este tipo de cosas.






operator-overloading