¿Cómo puedo saber el número de sustituciones en una cadena formateador?
-
27-09-2019 - |
Pregunta
Dado el siguiente método: (método real tiene algunos parámetros más, pero los más importantes están por debajo ...)
public string DoSomething(string formatter, params string[] values)
{
// Do something eventually involving a call to String.Format(formatter, values);
}
¿Hay una manera de saber si el conjunto tiene suficientes valores de los objetos en ella para cubrir el formateador, de modo que pueda lanzar una excepción si no hay (abreviatura de hacer el string.Format; que no es una opción hasta el final debido a algunas conversiones lambda)?
Solución
todavía no estoy claro por qué cree que no se puede utilizar string.Format
para probarlo. Si se supone que la aprobada en formateador tener marcadores de posición para los artículos en los valores, entonces usted debería ser capaz de hacer esto:
static void TestFormat(string formatter, params string[] values)
{
try
{
string.Format(formatter, values);
}
catch (FormatException e)
{
throw new Exception("the format is bad!!", e);
}
}
Uso de la muestra:
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
Tratando de hacer esto con una expresión regular va a ser difícil, porque ¿qué pasa con algo como esto:
"{0}, {1}, {abc}, {1a4} {5} }{"
{abc}
y {1a4}
no son válidos para string.Format
, y también hay que determinar para cada número válido ({0}, {1}, {5}
) que tiene al menos que muchos argumentos. Además, el }{
causará string.Format falle también.
acabo de utilizar el primer enfoque descrito anteriormente en un proyecto reciente y funcionó muy bien.
Otros consejos
creo que se está preocupando demasiado por esto. Si la cadena de formato no es válido, dejar que string.Format
lanzar la excepción en su caso. Si no desea que un FormatException
a ser lanzado, coger y tirar la excepción que desea.
Tampoco debe ser realmente un problema que ya se ha hecho un poco de algún tipo de procesamiento (por ejemplo. La evaluación de las conversiones lambda) porque esto es después de todo un circunstancia excepcional (posiblemente con la excepción de que las lambdas son muy costoso, en cuyo caso se hacen la prueba string.Format
primero sin procesar los argumentos para comprobar su validez y luego repetirlo cuando se necesita más tarde después del procesamiento).
Utilice una expresión regular para contar el número de plantillas, pero tenga cuidado, porque
string.Format("{0}{0}", 123)
es válido.
Usted realmente necesita proporcionar más información para esta pregunta a responder bien ...
Se podría hacer una expresión regular para los formateadores abrazadera y luego compararlos con la longitud de la matriz de valores.