Pergunta

Dado o seguinte método: ((o método real tem mais alguns parâmetros, mas os importantes estão abaixo ...)

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

Existe uma maneira de saber se minha matriz de valores tem objetos suficientes para cobrir o formatador, para que eu possa dar uma exceção se não houver (sem fazer a string.format; isso não é uma opção até o fim devido a algumas conversões de lambda)?

Foi útil?

Solução

Ainda não estou claro por que você acha que não pode usar string.Format para testá -lo. Se o passado no formatador deve ter espaços reservados para os itens em valores, você poderá fazer isso:

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 amostra:

        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

Tentar fazer isso com uma expressão regular será difícil, porque e algo assim:

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

{abc} e {1a4} não são válidos para string.Format, e você também precisa determinar para cada número válido ({0}, {1}, {5}) que você tem pelo menos tantos argumentos. Também o }{ fará com que String.Format também falhe.

Acabei de usar a abordagem anterior descrita acima em um projeto recente e funcionou muito bem.

Outras dicas

Eu acho que você está se preocupando muito com isso. Se a sequência do formato for inválida, deixe string.Format Jogue a exceção para você. Se você não quer um FormatException Para ser jogado, pegue -o e jogue a exceção que você deseja.

Também não deve ser realmente um problema que você já tenha feito algum processamento (por exemplo, avaliação de conversões lambda) porque isso é afinal um circunstância excepcional (com possivelmente a exceção de que os lambdas são muito caros, nesse caso string.Format Teste primeiro sem processar os argumentos para verificar se é válido e, em seguida, repita -o quando precisar posteriormente após o processamento).

Use um regex para contar o número de modelos, mas tenha cuidado, porque

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

é válido.

Você realmente precisa fornecer mais informações para que esta pergunta seja respondida ok ...

Você pode fazer um regex para os formatados de cinta e compará -los com o comprimento da matriz de valor.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top