C# 根据内部值替换字符串中的值

C# 根据内部值替换字符串中的值,c#,winforms,C#,Winforms,我试图创建一个模板字符串,该字符串具有占位符,占位符由数据库中的值替换,具体取决于它们的内部值。 即,模板如下所示: 模板可以更改为任何内容,任何列值都可以在括号内。。 我无法找到一种优雅的方法来获取内部值并用值替换它们…我将使用一个结构或类来表示它,并重写ToString。 您可能已经有了一个类,该类在逻辑上就是要格式化为字符串的类 public class StringHolder { public int No; public string CustomerName;

我试图创建一个模板字符串,该字符串具有占位符,占位符由数据库中的值替换,具体取决于它们的内部值。 即,模板如下所示:

模板可以更改为任何内容,任何列值都可以在括号内。。
我无法找到一种优雅的方法来获取内部值并用值替换它们…

我将使用一个结构或类来表示它,并重写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; }
    }
}

这就是我的解决方案

给你的格式字符串你可以这样做:

// 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);
}

它是有效的,但在效率方面使用正则表达式是很遗憾的。我认为性能的影响可以忽略不计,除非他在一个关键的循环中使用正则表达式。我喜欢这个理论。。但是正则表达式不起作用,因为\{是一个未受污染的转义符号。@michael请看编辑--我在家里没有访问visual studio的权限,所以我在瞎写。你需要在字符串前面放置
@
仍然不起作用。但这没关系,反正我该复习我的正则表达式了。我一直在学习它..并且忘记了它。
var sh = new StringHolder();

sh["No"] = jobNum;
sh["Customer"] = custName;
sh["Action"] = action;

var s = sh.ToString();
// 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);
}