2016-09-15 2 views
1

Ich habe eine Funktion, die wie folgt einen Text aus einer XML-Datei erhält:String Interpolation auf dem Ergebnis einer Funktion, die Zeichenfolge zurückgibt

var text = Translate("/foo/bar"); 

nun in der XML-I wie dies in String Interpolationskonstanten setzen will :

<foo> 
    <bar>Hi, {firstName} {lastName}!</bar> 
</foo> 

würde, dass Deshalb möchte ich String Interpolation auf das Ergebnis der Übersetzen-Funktion zu tun, so etwas wie:

var firstName = "John"; 
var lastName = "Smith"; 
var formattedText = $Translate("/foo/bar"); 

Aber das scheint nicht zu funktionieren. Gibt es einen Weg dazu, außer zu string.Format zurückzukehren?

Es könnte nett sein, wenn das Dollarzeichen vor irgendetwas platziert werden könnte, das eine Zeichenkette ist, sei es eine Variable, eine Zeichenkette oder eine Funktion, um eine Zeichenketteninterpolation durchzuführen.

Es ist erwähnenswert, dass ich keine Kontrolle über den Code für die Translate-Funktion habe, da es in einer Drittanbieter-Komponente ist.

+1

Es gibt einige Utility-Klassen für diese Art von Dingen geschrieben (z., [FormatWith] (http://james.newtonking.com/archive/2008/03/29/formatwith-2-0-string-formatting-with-named-variables)). Sie neigen jedoch dazu, undokumentierte Idiosynkrasien zu haben. Dies opfert zwar den Schutz des Typsystems, aber das ist ein Nachteil der Formatierung von Laufzeitzeichenfolgen. – Brian

Antwort

8

Nein, das geht nicht. Die String-Interpolation wird unter Kompilierzeit durchgeführt. Der Compiler untersucht das interpolierte String-Literal, findet die relevanten Formatzeichenfolgen und konvertiert sie in {0} usw. Es gibt nichts Ähnliches, um dies zur Ausführungszeit auszuführen.

4

Sie können das nicht tun.

String-Interpolation ist Teil Compiler Magie, Sie können String-Interpolation nicht zurück in eine normale Zeichenfolge injizieren. Da Sie die Methode Translate nicht ändern können, gibt es immer noch eine Zeichenkette zurück und Sie müssen das selbst tun.

Da das ganze schwere Heben (Finden der Ausdrücke, Extrahieren, Umschreiben der tatsächlichen Zeichenfolge usw.) zur Kompilierungszeit erfolgt, gibt es keine Laufzeitklassen, die Ihnen dabei helfen können. Jetzt


, wenn alle Sie ist der Name der Dinge haben, und nicht Ausdrücke im zurückgegebenen String, dann Sie konnte selbst tun. Mit anderen Worten, das genaue Beispiel, das Sie gezeigt haben, sollte nicht zu hart sein. Es wäre jedoch immer noch nicht "string interpolation" als solches, es wäre dein eigenes Ding. Mit anderen Worten, wenn die zurückgegebene Zeichenfolge jemals etwas wie ".... {firstname:-40} ..." enthalten hat, sind Sie für eine harte Fahrt.

Die einfachste naive Lösung wäre einfacher String Ersatz zu tun:

var formattedText = $Translate("/foo/bar") 
    .Replace("{firstname}", firstname) 
    .Replace("{lastname}", lastname); 
4

Wenn Sie Ihre Variablen in ein anonymes (oder definierte Objekt) umwandeln können, könnten Sie Smart (https://github.com/scottrippey/SmartFormat.NET).

var obj = new [MyClass - optional, if declared] 
{ 
    FirstName = "John", 
    LastName = "Smith", 
} 

var formattedText = Smart.Format(Translate("/foo/bar"), obj); 

Der Grund Code nicht funktioniert, wie ich es verstehe, ist, dass interpolierte Strings ausgewertet werden (Variablen in it), während der Kompilierung, nicht während der Laufzeit.

Verwandte Themen