Frage

Bei der folgenden Methode: (real-Methode hat ein paar mehr Parameter, aber die wichtigsten sind unter ...)

public string DoSomething(string formatter, params string[] values)
{
    // Do something eventually involving a call to String.Format(formatter, values);
}

Gibt es eine Möglichkeit zu sagen, ob meine Werte Array genug Objekte in es hat die Formatierer zu bedecken, so dass ich eine Ausnahme auslösen kann, wenn es nicht (kurz die string.Format zu tun, das ist keine Option bis zum Ende aufgrund einiger Lambda-Umwandlungen)?

War es hilfreich?

Lösung

Ich bin immer noch nicht klar, warum Sie denken, Sie nicht string.Format es testen können. Wenn die in Formatierer soll Platzhalter für die Elemente in Werten haben, dann sollten Sie in der Lage sein, dies zu tun:

static void TestFormat(string formatter, params string[] values)
{
    try
    {
        string.Format(formatter, values);
    }
    catch (FormatException e)
    {
        throw new Exception("the format is bad!!", e);
    }
}

Beispiel Verbrauch:

        TestFormat("{0}{1}{2}", "a", "b", "c"); // works ok
        TestFormat("{0}{1}{2}", "a", "b"); // throws exception
        TestFormat("{0}{1}{2}}0{", "a", "b", "c"); // throws exception

diese mit einem regulären Ausdruck zu tun versuchen wird hart sein, denn was ist so etwas wie folgt aus:

"{0}, {1}, {abc}, {1a4} {5} }{"

{abc} und {1a4} sind nicht gültig für string.Format, und Sie haben auch für jede gültige Nummer ({0}, {1}, {5}), um festzustellen, dass Sie zumindest, dass viele Argumente. Außerdem wird der }{ verursacht string.Format auch zum Scheitern verurteilt.

Ich habe nur den früheren oben beschriebenen Ansatz in einem aktuellen Projekt und es hat super funktioniert.

Andere Tipps

Ich glaube, Sie sind besorgniserregend zu viel darüber. Wenn das Format-String ungültig ist, lassen string.Format für Sie die Ausnahme werfen. Wenn Sie nicht über ein FormatException geworfen werden wollen, es fangen und werfen die Ausnahme, die Sie wollen.

Es sollte auch wirklich kein Problem sein, dass Sie bereits einige einig Verarbeitung getan haben (z. B. Lambda-Conversions Auswertung), denn dies ist schließlich ein außergewöhnlicher Umstand (mit möglicherweise der Ausnahme, dass die Lambda-Ausdrücke sind sehr teuer, wobei in diesem Fall tun, um den string.Format Test zunächst ohne die Argumente der Verarbeitung es gilt zu überprüfen, und dann wiederholen, wenn Sie später nach der Verarbeitung benötigen).

einen regulären Ausdruck verwenden, die Anzahl der Vorlagen zu zählen, aber vorsichtig sein, denn

string.Format("{0}{0}", 123)

gültig ist.

Sie müssen wirklich mehr Informationen bereitzustellen, um diese Frage ok beantwortet werden ...

Sie können für die Klammer Formatierer eine RegEx tun und sie dann auf die Länge des Wertes Array vergleichen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top