4 Stimmen

Wie erlaube ich meiner Klasse, in C# implizit in einen String konvertiert zu werden?

Ich möchte Folgendes tun...

public class A
{
    public string Content { get; set; }
}

A a = new A();
a.Content = "Hello world!";
string b = a; // b now equals "<span>Hello world!</span>"

Ich möchte also kontrollieren wie a wird in eine String irgendwie

12voto

David Hedlund Punkte 125085

Sie können die impliziten und expliziten Cast-Operatoren für eine Klasse manuell außer Kraft setzen. Anleitung hier . Ich würde aber sagen, dass es meistens ein schlechtes Design ist. Ich würde sagen, es ist einfacher zu sehen, was vor sich geht, wenn man schreibt

string b = a.ToHtml();

Aber es ist durchaus möglich...

public class A
{
    public string Content { get; set; }

    public static implicit operator string(A obj)
    {
        return string.Concat("<span>", obj.Content, "</span>");
    }
}

Um ein Beispiel dafür zu geben, warum ich dies nicht empfehle, betrachten Sie Folgendes:

var myHtml = "<h1>" + myA + "</h1>";

Die obigen Ausführungen ergeben "<h1><span>Hello World!</span></h1>"

Nun kommt ein anderer Entwickler daher und findet, dass der obige Code schlecht aussieht, und formatiert ihn in den folgenden um:

var myHtml = string.Format("<h1>{0}</h1>", myA);

Aber string.Format ruft intern ToString für jedes Argument, das es empfängt. Wir haben es also nicht mehr mit einem impliziten Cast zu tun, und infolgedessen wird der andere Entwickler das Ergebnis in etwas wie "<h1>myNamespace.A</h1>"

8voto

desco Punkte 16452
public class A
{
    public string Content { get; set; }
    public static implicit operator string(A a)
    {
        return string.Format("<span>{0}</span>", a.Content);
    }
}

3voto

Kent Boogaart Punkte 170094
public static implicit operator string(A a)
{
    return "foo";
}

0voto

Arseny Punkte 7141

ToString() zu überschreiben, wäre ein guter Weg. Außerdem erhalten Sie im Debug-Modus einen Hinweis auf den Rückgabewert von ToString().

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X