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)?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top