2011-12-30 3 views
4

このようなことを達成する最良の方法は何でしょうか?リソース文字列を別のものにフォーマットしますか?

次のような文字列がResource個あるとします。

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

そして、私はBadRequestParameterの値に、二番目に{1}を設定するとします。私は簡単に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内の文字列を書き込まないようにしたいと思います。したがって、これらの文字列の最後にフォーマットを追加しました。問題は、今、私はあなたが短いヘルパーメソッドを作成したい場合を除き:-)はい

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

答えて

1

と間違って絶対に何も表示されません。

代わりに使用する準備ができ既製の書式指定文字列を格納する

、あなたが本当のフォーマット文字列を構築するための原料を保存し、それらを使用する前に、文法的にプロ拡大するコードを追加することができます。たとえば、次のような文字列を格納することができ:として-あるもちろん

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のようにこれらの文字列を解析し、数字の代わりに中括弧の間に単語があるすべてのインスタンスを見つける必要があります。その後、各単語をそのシーケンス番号で置き換えて、中括弧の間にある名前に基づいてパラメータの配列を生成することができます。 parameters必要な再帰のこの配列を生成する、もちろん:

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." 
}; 

注:このケースでは、これらの2つの値(擬似コード)を取得します。

この時点で、あなたは、最終的な文字列を生成するために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

のような電話をかけることを避けるために、BadRequestParameterに何とかオートリファレンス{x}したいということですあなたがあなたのリソースの内部でそれらを事前に記入するために、なぜそれが理にかなってワイルドカードとして{#}を引数指標を扱う場合は、それは実際には単なる便宜上

public static string f(string format, params object[] p) 
{ 
    return string.Format(format, p); 
} 
+0

-1:これは悪い考えであり、臭いです。 –

+1

私は砂糖のために '.FormatWith()'拡張メソッドを使いますが、これは質問の外にあります。 – bevacqua

+0

何が悪いですか?私が同意する価値はほとんどありませんが、5文字以下の文字を入力したい場合は、それが彼のビジネスです。 –

0

のためになります。

私はそれらの中にいくつかの他のリソース文字列が含まれるすべてが第二のようなリソース文字列の多くを持っている

String.Format(RequiredParamterConstraint, "something", BadRequestParameter); 
+0

私は多くのことを繰り返しているので、ほとんどのリソースがフォーマット引数として 'BadRequestParameter'を持っています。これはバグ(手動で何らかの方法で自動適用する代わりに手動で配置する必要があります)を導入する可能性もあります。 – bevacqua

+0

それはstring.formatとリソースの全体のポイントです。私はそれがあなたのために行う複雑なロジックよりも多くのバグを導入する方法を見ていません。 – msarchet

関連する問題