Question

Compte tenu de la méthode suivante: (méthode réelle a quelques autres paramètres, mais les plus importants sont ci-dessous ...)

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

Y at-il un moyen de savoir si mon tableau de valeurs a suffisamment d'objets pour en couvrir le formatter, afin que je puisse lancer une exception s'il n'y a pas (peu de faire la string.Format, ce n'est pas une option jusqu'à la fin en raison de certaines conversions lambda)?

Était-ce utile?

La solution

Je ne comprends toujours pas pourquoi vous pensez que vous ne pouvez pas utiliser string.Format pour le tester. Si le passé dans formatter est censé avoir des espaces réservés pour les éléments de valeurs, alors vous devriez être en mesure de le faire:

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

Utilisation Exemple:

        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

Essayer de le faire avec une expression régulière va être dur, parce que ce quelque chose comme ceci:

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

{abc} et {1a4} ne sont pas valides pour string.Format, et vous devez aussi déterminer pour chaque numéro valide ({0}, {1}, {5}) que vous avez au moins que de nombreux arguments. En outre, le }{ fera string.Format échouer aussi bien.

Je viens d'utiliser l'ancienne méthode décrite ci-dessus dans un projet récent et il a très bien fonctionné.

Autres conseils

Je pense que vous vous inquiétez trop à ce sujet. Si la chaîne de format est invalide, laissez string.Format jeter l'exception pour vous. Si vous ne voulez pas FormatException d'être jeté, attraper et lancer l'exception que vous voulez.

Il ne doit pas vraiment être un problème que vous avez déjà fait une certaine transformation (par exemple. L'évaluation des conversions lambda) parce que c'est après tout une circonstance exceptionnelle (avec éventuellement l'exception que les lambdas sont très coûteux, auquel cas, effectuer le test string.Format premier sans traiter les arguments pour vérifier qu'il est valide, puis répéter quand vous avez besoin plus tard après le traitement).

Utilisez un regex pour compter le nombre de modèles, mais attention, parce que

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

est valide.

Vous avez vraiment besoin de fournir plus d'informations pour cette question à résoudre ok ...

Vous pourriez faire un RegEx pour les formatteurs accolade, puis de les comparer à la longueur du tableau de valeurs.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top