none
string.Format werte in Resource File übernehmen RRS feed

  • Frage

  • Ich habe in meinem Code folgenden string:

    string.Format("Sie haben {0} {1} eine Testseite erstellt", this.wert1, this.wert2);
    

    Diese möchte ich aber so wie er ist also inklusive der Platzhalter in ein Resource File auslagern. Ist das möglich? Ich möchte also im Prinzip folgenden Code haben:

    string.Format(ResourceHandler.GetString("id"), this.wert1, this.wert2);
    


    Sonntag, 23. Oktober 2011 09:06

Antworten

  • Hallo,

    Visual Studio unterstützt typsichere Ressource Dateien, d. h. wenn Du eine ResX-Resourcedatei ins Projekt einfügst,
    so wird dazu eine Codedatei erzeugt, die einen typsicheren Zugriff ermöglicht.

    "Dummerweise" hat man dabei die Unterstützung von Parametern vergessen,
    was generell relativ einfach ist, in dem man die Werte als params object[] arguments übergibt.

    Einmal mit festen Parametern und verallgemeinert, könnte das so aussehen,
    wobei eine Resourcedatei mit Namen Strings.resx die Zeichenkette String1 den Text "Sie haben ...{0} {1} ..." aufnimmt:

            internal static string GetTestSeite(string wert1, string wert2)
            {
                // Aus Strings.resx
                return string.Format(Strings.Culture, Strings.String1, wert1, wert2);
            }
    
            internal static string FormatString(string resourceid, params object[] args)
            {
                string resString = Strings.ResourceManager.GetString(resourceid, Strings.Culture);
                if (args != null && args.Length != 0)
                    return string.Format(Strings.Culture, resString, args);
                return resString;
            }
    

    und darunter eine verallgemeinerte Variante, die dann allerdings anfälliger für Laufzeitfehler ist,
    wenn man nicht die richtigen Argumente (oder -anzahl) übergibt.


    Leider muss man das in einer eigenen Klasse unterbringen, da die Ressourcedatei
    nicht als partial gekennzeichnet ist. Ausserdem wird dabei im Standard "internal" verwendet,
    was auch nicht immer gewünscht ist.

    Unter Extended Strongly Typed Resource Generator findest Du eine Erweiterung,
    die einige der fehlenden Kleinigkeiten ergänzt.

    Einige weitere Hintergrundinformationen findest Du unter Ressourcen in Anwendungen

    Gruß Elmar

    • Als Antwort markiert Gozar15 Montag, 24. Oktober 2011 10:16
    Sonntag, 23. Oktober 2011 18:51
    Beantworter

Alle Antworten

  • Klar geht das. Schau dir mal folgenden Link. Die Vorgehensweise ist bei allen .Net Technologien ähnlich...

    http://msdn.microsoft.com/en-us/library/cc838238(v=vs.95).aspx

    Sonntag, 23. Oktober 2011 12:46
  • Dort steht aber nichts zu dem Problem, das ich habe :(

    Ich möchte den obigen String inklusive der Platzhalter in ein resx packen. Wenn ich das tue und nur noch die zweite Zeile aufrufe, funktioniert das nicht.

    Sonntag, 23. Oktober 2011 14:53
  • >>Dort steht aber nichts zu dem Problem, das ich habe :(
    Du hast lediglich gefragt, ob sowas geht!

    >>Ich möchte den obigen String inklusive der Platzhalter in ein resx packen. Wenn ich das tue und nur noch die zweite Zeile aufrufe, funktioniert das nicht.
    "Funktioniert nicht" sind wenig Informationen...
    Hast du mal die Funktionalität debuggt?

    Sonntag, 23. Oktober 2011 16:26
  • Hallo,

    Visual Studio unterstützt typsichere Ressource Dateien, d. h. wenn Du eine ResX-Resourcedatei ins Projekt einfügst,
    so wird dazu eine Codedatei erzeugt, die einen typsicheren Zugriff ermöglicht.

    "Dummerweise" hat man dabei die Unterstützung von Parametern vergessen,
    was generell relativ einfach ist, in dem man die Werte als params object[] arguments übergibt.

    Einmal mit festen Parametern und verallgemeinert, könnte das so aussehen,
    wobei eine Resourcedatei mit Namen Strings.resx die Zeichenkette String1 den Text "Sie haben ...{0} {1} ..." aufnimmt:

            internal static string GetTestSeite(string wert1, string wert2)
            {
                // Aus Strings.resx
                return string.Format(Strings.Culture, Strings.String1, wert1, wert2);
            }
    
            internal static string FormatString(string resourceid, params object[] args)
            {
                string resString = Strings.ResourceManager.GetString(resourceid, Strings.Culture);
                if (args != null && args.Length != 0)
                    return string.Format(Strings.Culture, resString, args);
                return resString;
            }
    

    und darunter eine verallgemeinerte Variante, die dann allerdings anfälliger für Laufzeitfehler ist,
    wenn man nicht die richtigen Argumente (oder -anzahl) übergibt.


    Leider muss man das in einer eigenen Klasse unterbringen, da die Ressourcedatei
    nicht als partial gekennzeichnet ist. Ausserdem wird dabei im Standard "internal" verwendet,
    was auch nicht immer gewünscht ist.

    Unter Extended Strongly Typed Resource Generator findest Du eine Erweiterung,
    die einige der fehlenden Kleinigkeiten ergänzt.

    Einige weitere Hintergrundinformationen findest Du unter Ressourcen in Anwendungen

    Gruß Elmar

    • Als Antwort markiert Gozar15 Montag, 24. Oktober 2011 10:16
    Sonntag, 23. Oktober 2011 18:51
    Beantworter