Domanda

Dato il seguente metodo: (vero e proprio metodo ha alcuni più parametri, ma quelli più importanti sono al di sotto ...)

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

C'è un modo per dire se la mia matrice valori ha abbastanza oggetti in essa per coprire il formattatore, in modo che possa generare un'eccezione se non ce ne sono (a corto di fare lo string.Format, che non è un'opzione fino alla fine a causa di alcune conversioni lambda)?

È stato utile?

Soluzione

Non sono ancora chiaro il motivo per cui si pensa che non è possibile utilizzare string.Format per testarlo. Se il passato in formattatore si suppone di avere segnaposti per gli elementi in valori, allora si dovrebbe essere in grado di fare questo:

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

Utilizzo di esempio:

        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

Cercando di fare questo con un'espressione regolare sta per essere duro, perché ciò che di qualcosa di simile:

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

{abc} e {1a4} non sono validi per string.Format, e hai anche determinare per ciascun numero valido ({0}, {1}, {5}) che avete almeno che molti argomenti. Inoltre, il }{ causerà string.Format a fallire pure.

Ho appena usato il primo approccio sopra descritto in un recente progetto e ha funzionato grande.

Altri suggerimenti

Penso che si sono preoccupanti troppo di questo. Se la stringa di formato non è valido, lasciare che string.Format generare l'eccezione per voi. Se non si desidera un FormatException ad essere gettato, prenderlo e generare l'eccezione che si desidera.

Inoltre, non deve essere davvero un problema che si è già fatto un po 'di alcune elaborazioni (ad es. Valutare conversioni lambda), perché questo è dopo tutto un circostanza eccezionale (con forse l'eccezione che le lambda sono molto costoso, in questo caso fare il test prima string.Format senza elaborare gli argomenti per verificare che sia valido e quindi ripetere quando è necessario più tardi, dopo il trattamento).

Utilizzare una regex per contare il numero di modelli, ma attenzione, perché

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

è valido.

Hai davvero bisogno di fornire ulteriori informazioni per questa domanda a cui rispondere ok ...

Si potrebbe fare una regex per i formattatori brace e poi confrontarle con la lunghezza della schiera di valori.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top