Comment puis-je dire le nombre de remplacements dans une chaîne de formatter?
-
27-09-2019 - |
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)?
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.