Форматировать строку ресурса в другую? - PullRequest
4 голосов
/ 30 декабря 2011

Каков наилучший способ выполнить что-то подобное?

Предположим, у меня есть следующая пара Resource строк.

BadRequestParameter:            Potential bad request aborted before execution.
RequiredParameterConstraint:    {0} parameter requires a value. {1}

И предположим, я хочу установить {1} на втором, до значения BadRequestParameter.Я мог бы легко сделать это, используя string.Format.Но теперь предположим, что у меня есть много строк Resource, таких как вторая, каждая из которых включает в себя какую-то другую строку Resource.
Как лучше всего это кодировать?Использует ли string.Format повторение в каждом случае действительно все, что я могу сделать?

Обновление

Я попытаюсь объяснить себя лучше.Вот строки ресурсов, которые у меня есть на самом деле:

BadRequestParameter     Potential bad request aborted before execution. 
EmptyVector             Vectorized requests require at least one element. {0}
OverflownVector         Vectorized requests can take at most one hundred elements. {0}
RequiredParamConstraint {0} parameter requires a value. {1}
SortMinMaxConstraint    {0} parameter value '{1}' does not allow Min or Max parameters in this query. {2}
SortRangeTypeConstraint Expected {0} parameter Type '{1}'. Actual: '{2}'. {3}
SortValueConstraint     {0} parameter does not allow '{1}' as a value in this query. {2}

Я бы хотел избежать записи строки в BadRequestParameter в конце каждой из этих строк.Поэтому я добавил формат в конце этих строк.Теперь проблема в том, что я хотел бы как-то автоматически ссылаться на {x} на BadRequestParameter, чтобы избежать необходимости совершать звонки типа

string.Format(Error.EmptyVector, Error.BadRequestParameter);

Ответы [ 3 ]

1 голос
/ 30 декабря 2011

У меня есть много строк ресурсов, таких как вторая, каждая из которых включает в себя какую-то другую строку ресурсов.

Вместо хранения готовых строк формата, готовых к использованию, вы можете хранить исходные материалы для построения строк реального формата и добавлять код, чтобы расширять их программно перед использованием. Например, вы можете хранить строки следующим образом:

BadRequestParameter:            Potential bad request aborted before execution.
SupportNumber:                  (123)456-7890
CallTechSupport:                You need to call technical support at {SupportNumber}.
RequiredParameterConstraint:    {{0}} parameter requires a value. {BadRequestParameter} {CallTechSupport}

Конечно, передача этих строк в string.Format как есть не будет работать. Вам нужно проанализировать эти строки, например, с помощью RegExp s, и найти все случаи, когда у вас есть слово между фигурными скобками, а не число. Затем вы можете заменить каждое слово его порядковым номером и создать массив параметров на основе имен, которые вы найдете в фигурных скобках. В этом случае вы получите эти два значения (псевдокод):

formatString = "{{0}} parameter requires a value. {0} {1}";
// You replaced {BadRequestParameter} with {0} and {CallTechSupport} with {1}
parameters = {
    "Potential bad request aborted before execution."
,   "You need to call technical support at (123)456-7890."
};

Примечание: Конечно, для создания этого массива parameters требуется рекурсия.

На данный момент, вы можете вызвать string.Format для создания вашей последней строки:

var res = string.Format(formatString, parameters);

Возвращает строку, в которой строки ресурсов предварительно заменены для ваших вызывающих:

"{0} parameter requires a value. Potential bad request aborted before execution. You need to call technical support at (123)456-7890."

Теперь вызывающие абоненты могут использовать эту строку для форматирования, не беспокоясь о других значениях ресурса.

0 голосов
/ 30 декабря 2011

Если вы рассматриваете показатели аргументов {#} как символы подстановки, то для чего имеет смысл предварительно заполнять их внутри своего ресурса.

Я не вижу абсолютно ничего плохого в

String.Format(RequiredParamterConstraint, "something", BadRequestParameter);
0 голосов
/ 30 декабря 2011

Да :-), если вы не хотите создать вспомогательный метод, который короче, но для удобства это действительно просто

public static string f(string format, params object[] p)
{
    return string.Format(format, p);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...