Как я могу сказать количество замене в строке форматирования?

StackOverflow https://stackoverflow.com/questions/3057080

Вопрос

Учитывая следующий метод: (реальный метод имеет еще несколько параметров, но важные находятся ниже ...)

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

Есть ли способ сказать, если на массиве моих ценностей достаточно объектов в нем, чтобы покрыть форму, чтобы я мог выбрасывать исключение, если нет (не хватает строки. Format; это не вариант до конца Из-за некоторых преобразований лямбда)?

Это было полезно?

Решение

Я до сих пор не ясно, почему вы думаете, что не можете использовать string.Format проверить это. Если прошедший в Formatter должен иметь заполненные лица для элементов в значениях, то вы сможете сделать это:

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

Использование образца:

        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

Попытка сделать это с регулярным выражением, будет жестким, потому что как насчет чего-то вроде этого:

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

{abc} а также {1a4} недействителен string.Format, и вы также должны определить для каждого допустимого числа ({0}, {1}, {5}) Что у вас есть хотя бы многие аргументы. Так же }{ вызовет строку. Формат потерпеть неудачу.

Я только что использовал первый подход, описанный выше в недавнем проекте, и он отлично работал.

Другие советы

Я думаю, что вы слишком беспокоитесь об этом. Если строка формата недействительна, пусть string.Format бросить исключение для вас. Если вы не хотите FormatException быть брошенным, поймайте его и бросьте исключение, которое вы хотите.

Также не должно быть проблемой, которую вы уже сделали некоторую обработку (например, оценивать преобразования лямбда), потому что это ведь исключительные обстоятельства (с возможностью исключение, что лямбдас очень дорого, в этом случае сделает string.Format Проверьте сначала без обработки аргументов, чтобы проверить, что он действителен, а затем повторите его, когда вам нужно позже после обработки).

Используйте Regex для подсчета количества шаблонов, но будьте осторожны, потому что

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

является действительным.

Вам действительно нужно предоставить больше информации для этого вопроса, чтобы ответить в порядке ...

Вы можете сделать Regex для форматтеров скобки, а затем сравнивать их по длине массива значений.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top