キーと値のペアの辞書に読み込まれるapp.configファイル内のすべてのルートapi URLを設定しています。文字列を再帰ディクショナリ値に置き換えます。
Dictionary<string, string> variables = new Dictionary<string, string>()
{
{ "clientRefUrl", "[clientBaseUrl]/RealtimeReferenceData"},
{ "clientRealtimeUrl", "[clientBaseUrl]/RealtimeClinicalData"},
{ "localApiUrl", "LocalApi/Generic"},
{ "integrationRootFolder", "C:\\LocalServer\\Integration"},
{ "clientBaseUrl", "https://company.com/api"},
{ "clientAuthBaseUrl", "https://auth.company.com/api"}
};
私は<endpoint name="saveuser" address="[clientRefUrl]/SaveUser" />
のような設定ファイルから来ているAPIのURLを持っています。
私はそのURLをC#コードでhttps://company.com/api/RealtimeReferenceData/SaveUser
としたいと考えています。
私は以下の方法でこれを行うことができますが、クライアントはclientBaseUrl
をリストの先頭に移動しないようにしなければならないという問題があります。または、リストの先頭への依存キー。
public static string EvaluateStringWithVariables(string strExpr)
{
Dictionary<string, string> variables = new Dictionary<string, string>()
{
{ "clientRefUrl", "[clientBaseUrl]/RealtimeReferenceData"},
{ "clientRealtimeUrl", "[clientBaseUrl]/RealtimeClinicalData"},
{ "localApiUrl", "LocalApi/Generic"},
{ "integrationRootFolder", "C:\\LocalServer\\Integration"},
{ "clientBaseUrl", "https://company.com/api"},
{ "clientAuthBaseUrl", "https://auth.company.com/api"}
};
foreach (string variable in variables.Keys)
{
var pattern = @"\[" + variable + @"\]";
strExpr = Regex.Replace(strExpr, pattern, variables[variable]);
}
return strExpr;
}
制限なく同じ方法を実行するより良い方法がありますか?私は正規表現と再帰を使用する別の解決策を試してみました:
public static string EvaluateStringWithVariables(string strExpr)
{
Dictionary<string, string> variables = new Dictionary<string, string>()
{
{ "clientRefUrl", "[clientBaseUrl]/RealtimeReferenceData"},
{ "clientRealtimeUrl", "[clientBaseUrl]/RealtimeClinicalData"},
{ "localApiUrl", "LocalApi/Generic"},
{ "integrationRootFolder", "C:\\LocalServer\\Integration"},
{ "clientBaseUrl", "https://company.com/api"},
{ "clientAuthBaseUrl", "https://auth.company.com/api"}
};
Regex regEx = new Regex(@"\[(\w+)\]", RegexOptions.Compiled);
strExpr = regEx.Replace(strExpr, match =>
{
string val = String.Empty;
if (variables.TryGetValue(match.Groups[1].Value, out val))
{
return val;
}
return match.Value;
});
Match rmatch = regEx.Match(strExpr);
if (rmatch.Success)
{
return EvaluateStringWithVariables(strExpr);
}
return strExpr;
}
しかし、私はのような文字列を評価するために持っていたとき、再帰はうまくいきませんでした:辞書の一部ではない他の変数を評価しようとし続ける strExpr = "[integrationRootFolder]\\myfolder\\[msg.ClientId]\\In\\[personid]_[tabid]_[documentname]_[msg.ClientId].pdf";
を。
ディクショナリが注文されていない場合、あなたのユーザーが注文をリセットしなくても、あなたの 'foreach'が注文を維持するとは思わないはずです。また、私はあなたが正規表現の解決策でどのような問題を抱えているのかは分かりません。もちろん、辞書にないものをテストするつもりです。辞書の全体はテストが速いということです。プログラムを実行するまでは一致を維持するだけで、 'variables.TryGetValue'は決してtrueを返しません。 –
はい@ScottChamberlain、これは別の問題です。それを指してくれてありがとう。 –