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

本文关键字:字符串 替换 内部 | 更新日期: 2023-09-27 18:31:47

我试图创建一个模板字符串,该字符串具有占位符,这些占位符根据其内部值被数据库中的值替换。即,模板将如下所示:

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

然后,您只需更改属性,并放置实例。再次在其目标中执行 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();