内部値に応じてデータベースの値に置き換えられるプレースホルダーを持つテンプレート文字列を作成しようとしています。つまり、テンプレートは次のようになります。
No: {Job_Number} Customer: {Cust_Name} Action: {Action}
テンプレートは、任意の列値を角かっこで囲んで、任意の値に変更できます。内部値を取得して値に置き換えるための洗練された方法を理解することはできません。
これが私の解決策です。
あなたがこのようなことをすることができるあなたのフォーマット文字列を与えてください:
// this is a MatchEvaluater for a regex replace
string me_setFormatValue(Match m){
// this is the key for the value you want to pull from the database
// Job_Number, etc...
string key = m.Groups[1].Value;
return SomeFunctionToGetValueFromKey(key);
}
void testMethod(){
string format_string = @"No: {Job_Number}
Customer: {Cust_Name}
Action: {Action}";
string formatted = Regex.Replace(@"\{([a-zA-Z_-]+?)\}", format_string, me_SetFormatValue);
}
それを表す構造体またはクラスがあり、ToStringをオーバーライドします。あなたはおそらくすでにクラスを持っていて、それは論理的にあなたが文字列にフォーマットしているものです。
public class StringHolder
{
public int No;
public string CustomerName;
public string Action;
public override string ToString()
{
return string.Format("No: {1}{0}Customer: {2}{0}Action: {3}",
Environment.NewLine,
this.No,
this.CustomerName,
this.Action);
}
}
次に、プロパティを変更し、instance.ToStringを宛先に再度配置して、値を更新します。
次のように、StringHolderクラスをより一般的にすることができます。
public class StringHolder
{
public readonly Dictionary<string, string> Values = new Dictionary<string, string>();
public override string ToString()
{
return this.ToString(Environment.NewLine);
}
public string ToString(string separator)
{
return string.Join(separator, this.Values.Select(kvp => string.Format("{0}: {1}", kvp.Key, kvp.Value)));
}
public string this[string key]
{
get { return this.Values[key]; }
set { this.Values[key] = value; }
}
}
そして、使用法は次のようになります。
var sh = new StringHolder();
sh["No"] = jobNum;
sh["Customer"] = custName;
sh["Action"] = action;
var s = sh.ToString();